iOSメッセージプッシュ統合ドキュメント
リソースのダウンロード:
正式版: v1.1.2 Frameworkのダウンロード
GitHub: ThinkingDataPushExtension
正式版: v1.1.2 Frameworkのダウンロード
GitHub: ThinkingDataAnalyticsExtension
正式版: v3.1.6 Frameworkのダウンロード
すべてのイベント送信は、ThinkingSDKの送信機能に依存しているため、プロジェクトではまずThinkingSDKを統合する必要があります。
手順はThinkingSDK使用ドキュメントを参照してください
概要
ThinkingSDK v3.0.1以降のバージョンでは、プッシュクリックイベントを送信できます。
ThinkingDataPushExtension SDK(iOS 10以上で使用可能)で、プッシュリーチイベントを送信できます。
メインTargetに統合が必要なSDK
- cocoapodsでの導入をお勧めします
- ThinkingSDKは、データ収集機能とプッシュクリックイベントの送信に使用します
通知拡張Targetに統合が必要なSDK
- cocoapodsでの導入をお勧めします
- ThinkingDataPushExtensionは、通知到達イベントの自動送信に使用します
上記のSDKはいずれもThinkingDataCoreライブラリに依存しています。cocoapodsで統合する場合は自動的に導入されます。Framework方式を使用する場合は、ThinkingDataCoreのFrameworkライブラリを手動で導入する必要があります。
cocoapodsを使用する場合、ThinkingDataPushExtensionはThinkingDataAnalyticsExtensionライブラリを自動的に導入し、軽量なデータ収集機能を実現します。Framework方式を使用する場合は、ThinkingDataAnalyticsExtensionのFrameworkライブラリを手動でインポートする必要があります。
接続フロー
- appのメインtargetにデータ収集SDK(バージョン>= 3.1.0)を接続します
pod 'ThinkingSDK', '3.1.6'
- NotificationServiceを有効にします
プロジェクトで通知拡張のTargetを新規作成する必要があります。例:TANotification
- 通知拡張にThinkingDataPushExtensionを統合します
pod 'ThinkingDataPushExtension'
プッシュクリックの自動回収方式
自動回収の有効化
NSString *appId = @"appId";
NSString *serverUrl = @"serverUrl";
TDConfig *config = [[TDConfig alloc] initWithAppId:appId serverUrl:serverUrl];
// プッシュの自動回収を有効化
config.enableAutoPush = YES;
[TDAnalytics startAnalyticsWithConfig:config];
FCMプッシュ
「プッシュID」の送信
- FCMプッシュSDKを統合すると、ThinkingSDKが自動的に送信します(ThinkingSDKのバージョン>= v3.0.1が必要)
- アカウントの切り替え
アカウントを切り替えた後は、loginインターフェースを呼び出す必要があります。SDK内部で、プッシュtokenがuserSetインターフェースを通じて新しいアカウントに自動的に送信されます。
[TDAnalytics login:@"new_account_id"];
プッシュクリックイベントの収集
プッシュクリックイベントは自動的に送信されるため、手動での操作は不要です。
JPushプッシュ
「プッシュID」の送信
- JPushプッシュSDKを統合すると、ThinkingSDKが自動的に送信します(ThinkingSDKのバージョン>= v3.0.1が必要)
- アカウントの切り替え
アカウントを切り替えた後は、loginインターフェースを呼び出す必要があります。SDK内部で、プッシュtokenがuserSetインターフェースを通じて新しいアカウントに自動的に送信されます。
[TDAnalytics login:@"new_account_id"];
プッシュクリックイベントの収集
プッシュクリックイベントは自動的に送信されるため、手動での操作は不要です。
APNsプッシュ
APNs証明書の取得方法については、APNs証明書の取得方法を参照してください
「プッシュID」の送信
APNsチャンネルは現在、手動送信のみに対応しています
- loginを呼び出した後、またはアカウントを切り替えた後に、APNs Device Tokenを手動で送信します。
// login の後、APNs Device Token を再度送信
[TDAnalytics login:@"test_id"];
// 例:システムに登録された RemoteNotificationsWithDeviceToken を取得
NSString *token = [self getDviceTokenDemoFunction];
[TDAnalytics userSet:@{ @"#apns_token": token }];
APNs Device Tokenは、- application:didRegisterForRemoteNotificationsWithDeviceToken: コールバックで送信します
// SDK の初期化後、APNs のコールバックで APNs Device Token を送信
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// アカウント切り替え時に再度送信できるよう、ここで APNs Device Token を記録しておくことをお勧めします
NSString *token = [self formatDeviceTokenToHexStr:deviceToken];
[TDAnalytics userSet:@{ @"#apns_token": token }];
}
// (NSData *)deviceToken を (NSString *)deviceToken に変換
- (NSString *)formatDeviceTokenToHexStr:(NSData *)deviceToken {
NSString *tokenStr;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 13.0) {
const unsigned *tokenBytes = [deviceToken bytes];
tokenStr = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
} else {
tokenStr = [[deviceToken description] stringByReplacingOccurrencesOfString:@"<" withString:@""];
tokenStr = [tokenStr stringByReplacingOccurrencesOfString:@">" withString:@""];
tokenStr = [tokenStr stringByReplacingOccurrencesOfString:@" " withString:@""];
}
return tokenStr;
}
- アカウントの切り替え
アカウントを切り替えた後は、loginインターフェースを呼び出す必要があります。SDK内部で、プッシュtokenがuserSetインターフェースを通じて新しいアカウントに自動的に送信されます。
[TDAnalytics login:@"new_account_id"];
プッシュクリックイベントの収集
プッシュクリックイベントは自動的に送信されるため、手動での操作は不要です。
プッシュクリックの手動回収方式
FCMプッシュ
「プッシュID」の送信
- loginを呼び出した後、またはアカウントを切り替えた後に、FCMのTokenを送信します。
NSString *appId = @"app-id";
NSString *serverUrl = @"server-url";
TDConfig *tdConfig = [[TDConfig alloc] initWithAppId:appId serverUrl:serverUrl];
[TDAnalytics startAnalyticsWithConfig:tdConfig];
[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
if (error != nil) {
NSLog(@"Error getting FCM registration token: %@", error);
} else {
NSLog(@"FCM registration token: %@", token);
[TDAnalytics userSet:@{@"fcm_token": token}];
}
}];
プッシュクリックイベントの収集
ユーザーがプッシュ通知をクリックしたときに、システムのプッシュクリックコールバックでプッシュクリックイベントを送信できます。
// use <UserNotifications/UserNotifications.h> framework
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
NSDictionary *userInfo = response.notification.request.content.userInfo;
// trackAppOpenNotification メソッドの例は、後述の「付録」を参照してください
[self trackAppOpenNotification:userInfo];
completionHandler();
}
JPushプッシュ
「プッシュID」の送信
- AEのloginを呼び出した後、またはアカウントを切り替えた後に、JPushのRegistration IDを送信します。
// login の後、registrationID を再度送信
[TDAnalytics login:@"test_id"];
[TDAnalytics userSet:@{@"jiguang_id": registrationID}];
- JPushのRegistration IDは、- registrationIDCompletionHandler: コールバックで送信します。
// AE SDKの初期化後、JPushのコールバックでregistrationIDを送信
[JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
[TDAnalytics userSet:@{@"jiguang_id": registrationID}];
}];
プッシュクリックイベントの収集
// iOS10以下で通知をクリックしたときのコールバック
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[JPUSHService handleRemoteNotification:userInfo];
// trackAppOpenNotification メソッドの例は、後述の「付録」を参照してください
[self trackAppOpenNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
// iOS10以上で通知をクリックしたときのコールバック
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler API_AVAILABLE(ios(10.0)){
// Required
NSDictionary *userInfo = response.notification.request.content.userInfo;
// trackAppOpenNotification メソッドの例は、後述の「付録」を参照してください
[self trackAppOpenNotification:userInfo];
// システムの要件により、このメソッドを実行する必要があります
completionHandler();
}
APNsプッシュ
「プッシュID」の送信
- AEのloginを呼び出した後、またはアカウントを切り替えた後に、APNs Device Tokenを送信します。
// login の後、APNs Device Token を再度送信
[TDAnalytics login:@"test_id"];
// 例:システムに登録された RemoteNotificationsWithDeviceToken を取得
NSString *token = [self getDviceTokenDemoFunction];
[TDAnalytics userSet:@{ @"#apns_token": token }];
- APNs Device Tokenは、- application:didRegisterForRemoteNotificationsWithDeviceToken: コールバックで送信します
// SDK の初期化後、APNs のコールバックで APNs Device Token を送信
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// アカウント切り替え時に再度送信できるよう、ここで APNs Device Token を記録しておくことをお勧めします
NSString *token = [self formatDeviceTokenToHexStr:deviceToken];
[TDAnalytics userSet:@{ @"#apns_token": token }];
}
// (NSData *)deviceToken を (NSString *)deviceToken に変換
- (NSString *)formatDeviceTokenToHexStr:(NSData *)deviceToken {
NSString *tokenStr;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 13.0) {
const unsigned *tokenBytes = [deviceToken bytes];
tokenStr = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
} else {
tokenStr = [[deviceToken description] stringByReplacingOccurrencesOfString:@"<" withString:@""];
tokenStr = [tokenStr stringByReplacingOccurrencesOfString:@">" withString:@""];
tokenStr = [tokenStr stringByReplacingOccurrencesOfString:@" " withString:@""];
}
return tokenStr;
}
プッシュクリックイベントの収集
// iOS10以下で通知をクリックしたときのコールバック
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// trackAppOpenNotification メソッドの例は、後述の「付録」を参照してください
[self trackAppOpenNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
// iOS10以上で通知をクリックしたときのコールバック
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler {
NSDictionary *userInfo = response.notification.request.content.userInfo;
// trackAppOpenNotification メソッドの例は、後述の「付録」を参照してください
[self trackAppOpenNotification:userInfo];
// システムの要件により、このメソッドを実行する必要があります
completionHandler();
}
メッセージ到達イベントの収集
通知拡張のtargetに次のコードを追加します
#import <ThinkingDataPushExtension/ThinkingDataPushExtension.h>
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
NSString *appId = @"your app id in TE";
NSString *serverUrl = @"your server url in TE";
NSString *accountId = @"user account id. AccountId and DistinctId cannot be empty at the same time";
NSString *distinctId = @"user distinct id. AccountId and DistinctId cannot be empty at the same time";
BOOL result = [TDPushExtension handleNotificationRequest:request withContentHandler:contentHandler appId:appId serverUrl:serverUrl accountId:accountId distinctID:distinctId];
if (result) {
return;
}
self.contentHandler(self.bestAttemptContent);
}
パラメータの説明:
- appId:AEの管理画面で、プロジェクトのAPP IDを確認できます
- serverUrl:AEの管理画面で、プロジェクトのreceiver urlを確認できます
- accountId: エンゲージ管理画面でパススルーパラメータを設定し、ここで手動でaccountIdを解析する必要があります
- distinctId: エンゲージ管理画面でパススルーパラメータを設定し、ここで手動でdistinctIdを解析する必要があります
エンゲージ管理画面での設定場所:AEの管理画面の「エンゲージ → エンゲージ設定 → チャンネル設定 → 通知」でAPNsチャンネルを新規作成または編集し(FCM、JPushチャンネルも同様)、チャンネル設定ドロワー下部の「パススルーパラメータ」に次の内容を追加します:
プッシュメッセージの処理
FCMプッシュ
ユーザーがプッシュ通知をクリックしたときに、システムのプッシュクリックコールバックでプッシュパラメータを取得できます。
次の2つの方式のいずれかを選択することをお勧めします。
- メッセージタイプの解析:handleTEPushActionメソッドを呼び出します。
- パススルーパラメータの解析:handleTEPassThroughActionメソッドを呼び出します。
// use <UserNotifications/UserNotifications.h> framework
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
NSDictionary *userInfo = response.notification.request.content.userInfo;
//通常パラメータを処理する場合は、次のメソッドを呼び出します
[self handleTEPushAction:userInfo];
//パススルーパラメータを処理する場合は、次のメソッドを呼び出します
[self handleTEPassThroughAction:userInfo];
completionHandler();
}
JPushプッシュ
次の2つの方式のいずれかを選択することをお勧めします。
- メッセージタイプの解析:handleTEPushActionメソッドを呼び出します。
- パススルーパラメータの解析:handleTEPassThroughActionメソッドを呼び出します。
// iOS10以下で通知をクリックしたときのコールバック
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// Required, iOS 7 Support
[JPUSHService handleRemoteNotification:userInfo];
//通常パラメータを処理する場合は、次のメソッドを呼び出します
[self handleTEPushAction:userInfo];
//パススルーパラメータを処理する場合は、次のメソッドを呼び出します
[self handleTEPassThroughAction:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
// iOS10以上で通知をクリックしたときのコールバック
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler API_AVAILABLE(ios(10.0)){
// Required
NSDictionary *userInfo = response.notification.request.content.userInfo;
//通常パラメータを処理する場合は、次のメソッドを呼び出します
[self handleTEPushAction:userInfo];
//パススルーパラメータを処理する場合は、次のメソッドを呼び出します
[self handleTEPassThroughAction:userInfo];
// システムの要件により、このメソッドを実行する必要があります
completionHandler();
}
APNsプッシュ
次の2つの方式のいずれかを選択することをお勧めします。
- 通常パラメータ:handleTEPushActionメソッドを呼び出します。
- パススルーパラメータ:handleTEPassThroughActionメソッドを呼び出します。
// iOS10以下で通知をクリックしたときのコールバック
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
//通常パラメータを処理する場合は、次のメソッドを呼び出します
[self handleTEPushAction:userInfo];
//パススルーパラメータを処理する場合は、次のメソッドを呼び出します
[self handleTEPassThroughAction:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
// iOS10以上で通知をクリックしたときのコールバック
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler {
NSDictionary *userInfo = response.notification.request.content.userInfo;
//通常パラメータを処理する場合は、次のメソッドを呼び出します
[self handleTEPushAction:userInfo];
//パススルーパラメータを処理する場合は、次のメソッドを呼び出します
[self handleTEPassThroughAction:userInfo];
// システムの要件により、このメソッドを実行する必要があります
completionHandler();
}
プッシュ画像の表示
通知拡張targetにThinkingDataPushExtension SDKを統合する必要があります。すでにメッセージ到達イベントの収集を追加している場合は、この操作を繰り返す必要はありません。
通知拡張のtargetに次のコードを追加します
#import <ThinkingDataPushExtension/ThinkingDataPushExtension.h>
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
NSString *appId = @"your app id in TE";
NSString *serverUrl = @"your server url in TE";
NSString *accountId = @"user account id. AccountId and DistinctId cannot be empty at the same time";
NSString *distinctId = @"user distinct id. AccountId and DistinctId cannot be empty at the same time";
BOOL result = [TDPushExtension handleNotificationRequest:request withContentHandler:contentHandler appId:appId serverUrl:serverUrl accountId:accountId distinctID:distinctId];
if (result) {
return;
}
self.contentHandler(self.bestAttemptContent);
}
パラメータの説明:
- appId:AEの管理画面で、プロジェクトのAPP IDを確認できます
- serverUrl:AEの管理画面で、プロジェクトのreceiver urlを確認できます
- accountId: エンゲージ管理画面でパススルーパラメータを設定し、ここで手動でaccountIdを解析する必要があります
- distinctId: エンゲージ管理画面でパススルーパラメータを設定し、ここで手動でdistinctIdを解析する必要があります
エンゲージ管理画面での設定場所:AEの管理画面の「エンゲージ → エンゲージ設定 → チャンネル設定 → 通知」でAPNsチャンネルを新規作成または編集し(FCM、JPushチャンネルも同様)、チャンネル設定ドロワー下部の「パススルーパラメータ」に次の内容を追加します:
付録
クライアントが受信するプッシュパラメータの例
以下は、クライアントが受信する拡張フィールドのパラメータのみを示しています
{
"te_extras": {
//プッシュクリック時の遷移方式
"ops_loading_type": "OPEN_APP",
//パススルーパラメータ
"passthrough_params": {
"param1": "abc",
"param2": 101,
"param3": [{
"subText1": "xyz",
"subText2": 2
}]
},
//AE運用チャネルのレシートプロパティ
"#ops_receipt_properties": {
"ops_task_id": "0082",
"ops_project_id": 1,
"ops_task_instance_id": "0082_20230331",
"ops_push_language": "default",
"ops_task_exec_detail_id": "55"
}
}
}
プッシュ回収フローの接続が成功したことを確認するには?
- プッシュを接続した後、初回起動時またはプッシュtokenの変更時に、次のイベントが送信されるかどうかを確認します。
{"#type": "user_set","#time": "2023-11-13 15:50:55.729","#distinct_id": "distinct","properties": {"jiguang_id": "190e35f7e15c8481caa"},"#uuid": "9f233c31-a664-46ff-94d6-f767a3098c3a"}
- プッシュ通知をクリックしてアプリを起動し、te_ops_push_clickイベントが送信されるか、イベントプロパティに#ops_receipt_propertiesが含まれているかを確認します。
{"#type": "track","#time": "2023-03-16 16:08:32.191","#distinct_id": "90d80464-6832-43f1-80d9-bd93fc09c4fe","#event_name": "te_ops_push_click","properties": {"#lib_version": "3.0.1-beta.1","#carrier": "中国移动","#os": "Android","#device_id": "6262ca7f71e6aca3","#screen_height": 2400,"#bundle_id": "cn.thinkingdata.random","#device_model": "M2012K11AC","#screen_width": 1080,"#system_language": "zh","#install_time": "2023-03-10 11:24:44.285","#simulator": false,"#lib": "Android","#manufacturer": "Xiaomi","#os_version": "11","#app_version": "1.0","#fps": 60,"#network_type": "WIFI","#ram": "2.7\/7.4","#disk": "4.6\/106.3","#device_type": "Phone","#ops_receipt_properties": {"ops_project_id": 1,"ops_request_id": "3b21d2a8-8d3d-44fa-b460-3bb311ed3bcd"},"#zone_offset": 8},"#uuid": "7a977e23-b78a-4433-baae-ead17ad2fde9"}
trackAppOpenNotification
プッシュクリックイベント
- (void)trackAppOpenNotification:(NSDictionary *)userInfo{
@try {
if ([userInfo.allKeys containsObject:@"te_extras"] && [userInfo[@"te_extras"] isKindOfClass:[NSString class]]) {
NSData *jsonData = [userInfo[@"te_extras"] dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *responseDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
NSDictionary *opsReceiptProperties = responseDic[@"#ops_receipt_properties"];
if ([opsReceiptProperties isKindOfClass:[NSString class]]) {
NSString *opsStr = (NSString *)opsReceiptProperties;
opsReceiptProperties = [NSJSONSerialization JSONObjectWithData:[opsStr dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:&err];
}
if (opsReceiptProperties && [opsReceiptProperties isKindOfClass:[NSDictionary class]]) {
NSMutableDictionary *pushProperties = [NSMutableDictionary dictionary]; // track 用の辞書
pushProperties[@"#ops_receipt_properties"] = opsReceiptProperties;
[TDAnalytics track:@"te_ops_push_click" properties:pushProperties];
[TDAnalytics flush];
}
}
} @catch (NSException *exception) {
}
}
handleTEPushAction
プッシュメッセージタイプの解析
- (void)handleTEPushAction:(NSDictionary *)userInfo{
@try {
NSString *jsonString = userInfo[@"te_extras"];
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
NSDictionary *sfDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
if (!sfDictionary || error) {
return;
}
NSString *sf_landing_type = sfDictionary[@"ops_loading_type"];
if ([sf_landing_type isEqualToString:@"OPEN_APP"]) {
// App を開く
}
else if ([sf_landing_type isEqualToString:@"OPEN_URL"]) {
// URL を開く
NSString *url = sfDictionary[@"ops_url"];
}
else if ([sf_landing_type isEqualToString:@"CUSTOMIZED"]) {
// カスタムメッセージを処理
NSString *customized = sfDictionary[@"ops_customized"];
}
} @catch (NSException *exception) {
}
}
handleTEPassThroughAction
パススルーパラメータの解析
- (void)handleTEPassThroughAction:(NSDictionary *)userInfo{
@try {
NSString *jsonString = userInfo[@"te_extras"];
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
NSDictionary *sfDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
if (!sfDictionary || error) {
return;
}
NSString *params = sfDictionary[@"passthrough_params"];
if (params) {
// params はパススルーパラメータです。以降で具体的な業務ロジックを実装します
}
} @catch (NSException *exception) {
}
}

