高度なオプション
WKWebViewベースのハイブリッドアプリのためのセッション管理やJavaScript統合を含む高度なSDK機能を設定します。
セッション管理
自動セッション管理
Singular SDKは、モダンなiOSアプリ向けに追加設定なしでセッション管理を自動的に処理します。
デフォルトの動作:
アプリが60秒以上バックグラウンドに移動すると、SDKはフォアグラウンドに戻ったときに新しいセッションを登録します。
セッションタイムアウトの設定
アプリの使用パターンに合わせてセッションタイムアウト時間をカスタマイズします。
メソッドのシグネチャ
+ (void)setSessionTimeout:(int)timeoutInSeconds;
// Initialize SDK configuration
guard let config = SingularConfig(
apiKey: "SDK_KEY",
andSecret: "SDK_SECRET"
) else {
return
}
// Set session timeout to 120 seconds (2 minutes)
Singular.setSessionTimeout(120)
// Start the SDK
Singular.start(config)
// Initialize SDK configuration
SingularConfig *config = [[SingularConfig alloc]
initWithApiKey:@"SDK_KEY"
andSecret:@"SDK_SECRET"];
// Set session timeout to 120 seconds (2 minutes)
[Singular setSessionTimeout:120];
// Start the SDK
[Singular start:config];
タイムアウトの値
- デフォルト:60秒
- 最小値:0秒0秒(バックグラウンド/フォアグラウンドの遷移ごとに新しいセッションが作成される
- 推奨:アプリの使用パターンに応じて30~180秒
ベストプラクティス: Singular.start() を呼び出す前にsetSessionTimeoutを呼び出し、タイムアウト値が最初のセッションから適用されるようにする。
ハイブリッドアプリのJavaScriptインターフェイス
概要
JavaScriptインターフェースを使用して、WKWebViewベースのハイブリッドアプリでJavaScriptコードからSingular SDK機能を有効にします。
サポートされるメソッド
- setCustomUserId:カスタムユーザー識別子を設定
- unsetCustomUserId:カスタムユーザー識別子を削除
- イベント属性の有無にかかわらずイベントを追跡
- revenue:収益のトラッキング
WKWebView統合の設定
ビューコントローラーのWKNavigationDelegateでJavaScriptインターフェースを設定し、JavaScriptからSingular SDKのメソッドを使用できるようにします。
注:iOS 8.0+から、Appleはアプリにウェブコンテンツを追加するために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デリゲートメソッドを実装する。 -
processJSRequestWKを呼び出し、Singular SDK リクエストを処理する
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 文字列化オブジェクトとして渡す必要があります。
-
メソッド名はキャメルケースを使用します(例:
setCustomUserId)。 - インターフェースは、JavaScript 呼び出しをネイティブ SDK メソッドに自動的にブリッジします。