ハイブリッドアプリ向け JavaScript インターフェース
概要
JavaScript インターフェースを使用して、WKWebView ベースのハイブリッドアプリの JavaScript コードから Singular SDK 機能を有効にします。
サポートされているメソッド:
- setCustomUserId: カスタムユーザー識別子を設定
- unsetCustomUserId: カスタムユーザー識別子を削除
- event: 属性の有無にかかわらずイベントを追跡
- revenue: 収益を追跡
WKWebView 統合のセットアップ
ビューコントローラーの WKNavigationDelegate で JavaScript インターフェースを構成して、JavaScript から Singular SDK メソッドを使用できるようにします。
注: iOS 8.0 以降、Apple はアプリに Web コンテンツを追加するために WKWebView の使用を推奨しています。 UIWebView や WebView は使用しないでください。詳細については、 Apple の WKWebView ドキュメント を参照してください。
import UIKit
import WebKit
class ViewController: UIViewController {
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
// Create WKWebView
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.navigationDelegate = self
view.addSubview(webView)
// Load web content
if let url = Bundle.main.url(forResource: "index", withExtension: "html") {
webView.loadFileURL(url, allowingReadAccessTo: url)
}
}
}
extension ViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
// Check if Singular JavaScript interface exists
let js = "typeof(Singular)"
webView.evaluateJavaScript(js) { (result, error) -> Void in
if let resultString = result as? String {
if resultString == "undefined" {
// Load Singular JavaScript interface
do {
if let path = Bundle.main.path(forResource: "Singular", ofType: "js") {
let contents = try String(contentsOfFile: path)
webView.evaluateJavaScript(contents, completionHandler: nil)
}
} catch {
print("Error loading Singular.js: \(error)")
}
} else {
// Process Singular SDK request
Singular.processJSRequestWK(webView, withURL: navigationAction.request)
}
}
}
// Allow navigation
decisionHandler(.allow)
}
}
#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>
#import <Singular/Singular.h>
@interface ViewController () <WKNavigationDelegate>
@property (strong, nonatomic) WKWebView *webView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Create WKWebView
WKWebViewConfiguration *webConfiguration = [[WKWebViewConfiguration alloc] init];
self.webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:webConfiguration];
self.webView.navigationDelegate = self;
[self.view addSubview:self.webView];
// Load web content
NSURL *url = [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html"];
if (url) {
[self.webView loadFileURL:url allowingReadAccessToURL:url];
}
}
- (void)webView:(WKWebView *)webView
decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
// Check if Singular JavaScript interface exists
NSString *js = @"typeof(Singular)";
[webView evaluateJavaScript:js completionHandler:^(id result, NSError *error) {
if ([result isKindOfClass:[NSString class]]) {
NSString *resultString = (NSString *)result;
if ([resultString isEqualToString:@"undefined"]) {
// Load Singular JavaScript interface
NSString *path = [[NSBundle mainBundle] pathForResource:@"Singular" ofType:@"js"];
if (path) {
NSError *readError;
NSString *contents = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:&readError];
if (contents) {
[webView evaluateJavaScript:contents completionHandler:nil];
} else {
NSLog(@"Error loading Singular.js: %@", readError);
}
}
} else {
// Process Singular SDK request
[Singular processJSRequestWK:webView withURL:navigationAction.request];
}
}
}];
// Allow navigation
decisionHandler(WKNavigationActionPolicyAllow);
}
@end
セットアップ要件:
-
アプリバンドルに
Singular.jsファイルを含めます - ビューコントローラーを WKWebView のナビゲーションデリゲートとして設定します
-
decidePolicyForNavigationActionデリゲートメソッドを実装します -
Singular SDK リクエストを処理するために
processJSRequestWKを呼び出します
JavaScript の使用方法
WKWebView で実行されている JavaScript コードから Singular メソッドを呼び出します。
イベントの追跡
// Simple event without attributes
Singular.event('level_completed');
// Event with attributes (pass as JSON string)
Singular.event('purchase_attempt',
JSON.stringify({
"item_name": "sword",
"item_category": "weapons",
"item_price": 9.99
})
);
収益の追跡
// Track revenue in USD
Singular.revenue('USD', 9.99);
// Track revenue in other currencies
Singular.revenue('EUR', 8.50);
カスタムユーザー ID の管理
// Set custom user ID
Singular.setCustomUserId('user_12345');
// Remove custom user ID
Singular.unsetCustomUserId();
JavaScript API に関する注意事項:
-
すべてのメソッドはグローバルな
Singularオブジェクトで呼び出されます - イベント属性は JSON 文字列化されたオブジェクトとして渡す必要があります
-
メソッド名は camelCase を使用します (例:
setCustomUserId) - インターフェースは JavaScript の呼び出しをネイティブの SDK メソッドに自動的にブリッジします