プッシュ通知を受信する
画像などを添付したプッシュ通知に対応する場合
画像や動画などを添付したリッチプッシュ通知に対応するにはExtensionの作成が必要です。
詳しくは リッチプッシュ通知に対応する をご覧ください。
プッシュ通知を受信したい場合は、リモート通知機能を利用することで実現可能です。
リモート通知機能は、KARTE SDKの導入及びKarteRemoteNotification
モジュールを導入することで利用可能です。
- 参考:SDKを導入する
なお KARTE ではプッシュ通知の送信に、Firebase Cloud Messaging(以下FCM)を利用しています。
そのためFCM経由でプッシュ通知を送信するために各種設定を行う必要があります。
また受信側アプリケーションでも FCM SDK の導入が必要となります。
導入手順
1. FCM SDK を導入する
-
SDKを導入する
導入に関しては、下記ドキュメントをご覧ください。
Set up a Firebase Cloud Messaging client app on iOS -
Notification Composer で通知のテストを行う
Firebase の Notification Composer から通知メッセージを送信し、メッセージが受信できるか確認してください。
Send a notification message
2. サービスアカウントの設定を行う
KARTEからFCMに対して通知の送信リクエストを行うために、KARTE側にサービスアカウントの設定を行う必要があります。
サービスアカウントを設定する
3. KARTE SDK を導入する
- Podfile の編集
プロジェクトディレクトリにあるPodfile
を任意のエディタで開き、KarteRemoteNotification
の Pod を追加します。
pod 'KarteRemoteNotification'
- Pod のインストール
プロジェクトディレクトで下記コマンドを実行し、Pod をインストールします。
pod install
実装手順
1. FCMトークンを送信する
KARTE からプッシュ通知を送信するためには、FCMトークンが必要となります。
そのためアプリケーションからKARTEにFCMトークンを送信する処理を実装します。
- SDKのインポート宣言を追加
messaging(_:didReceiveRegistrationToken:)
を実装しているファイルの先頭にインポート宣言を追加します。
import KarteRemoteNotification
@import KarteRemoteNotification;
- FCMトークンの送信処理を追加
messaging(_:didReceiveRegistrationToken:)
メソッド内に送信処理を追加します。
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
// FCMトークンが生成/更新されたタイミングで、KARTE側にFCMトークンを登録
KarteApp.registerFCMToken(fcmToken)
}
- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken
{
// FCMの登録トークンが生成/更新されたタイミングで、KARTE側に登録トークンを送信
[KRTApp registerFCMToken:fcmToken];
}
[ 参考]FCM登録トークンや、アプリPUSH通知許可設定がKARTEに送信されるタイミング
2. 通知開封時の処理を実装する
受信したプッシュ通知をタップ(開封)した際、通知メッセージに含まれているリンクを開くためには下記の実装が必要となります。
※プッシュ通知のタップ時に、任意の画面に遷移させる等の処理をさせたい場合には必須の実装です。
なおクラスやメソッドの詳細は随時リファレンスを参照ください。
また通知タップ時にはmessage_click
イベントが自動で送信されます、送信されない場合はFAQ: 通知の開封を検知できませんを参照下さい。
Case1. UserNotifications.frameworkを利用するアプリケーションの場合
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo
// KARTE経由のプッシュ通知であるか判定
if let notification = RemoteNotification(userInfo: userInfo) {
// KARTE経由のプッシュ通知のリンクを開く
notification.handle()
} else {
// KARTE以外のシステムから送信されたプッシュ通知
}
completionHandler()
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
NSDictionary *userInfo = response.notification.request.content.userInfo;
// KARTE経由のプッシュ通知であるか判定
KRTRemoteNotification *notification = [[KRTRemoteNotification alloc] initWithUserInfo:userInfo];
if (notification) {
// KARTE経由のプッシュ通知のリンクを開く
[notification handle];
} else {
// KARTE以外のシステムから送信されたプッシュ通知
}
completionHandler();
}
Case2. UserNotifications.frameworkを利用しないまたはiOS10未満をサポートするアプリケーションの場合
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
switch application.applicationState {
case .active, .inactive:
// KARTE経由のプッシュ通知であるか判定
if let notification = RemoteNotification(userInfo: userInfo) {
// KARTE経由のプッシュ通知のリンクを開く
notification.handle()
} else {
// KARTE以外のシステムから送信されたプッシュ通知
}
case .background:
break
}
completionHandler(UIBackgroundFetchResult.newData)
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler
{
switch (application.applicationState) {
case UIApplicationStateActive:
case UIApplicationStateInactive:
{
// KARTE経由のプッシュ通知であるか判定
KRTRemoteNotification *notification = [[KRTRemoteNotification alloc] initWithUserInfo:[NSDictionary dictionary]];
if (notification) {
// KARTE経由のプッシュ通知のリンクを開く
[notification handle];
} else {
// KARTE以外のシステムから送信されたプッシュ通知
}
break;
}
case UIApplicationStateBackground:
break;
}
completionHandler(UIBackgroundFetchResultNewData);
}
なお通知メッセージに含まれるURLを独自に処理したい場合は、RemoteNotification
クラスの url
プロパティを参照することで、URLのみを取り出すことが可能です。
その他の変数の取得についてはデフォルト変数とペイロード値の対応関係についてをご確認ください。
if let url = RemoteNotification(userInfo: userInfo)?.url {
// KARTE経由のプッシュ通知かつURLが設定されている場合
// URLに応じて独自にリンクを処理する
}
NSURL *url = [[[KRTRemoteNotification alloc] initWithUserInfo:userInfo] url];
if (url) {
// KARTE経由のプッシュ通知かつURLが設定されている場合
// URLに応じて独自にリンクを処理する
}
Universal Links を利用してアプリ内に遷移させるには?
handle
メソッドが内部で利用している、UIApplication
クラスのopenURL
メソッドは、Universal Links を適切に処理することができないため、そのままではSafari
が起動してしまいます。
そのため Universal Links をプッシュ通知に指定する場合は、アプリケーション側で通知クリック後の処理を実装する必要があります。
参考:Universal Links に対応する
動作確認
最後に正しく導入が行われているか確認を行うためにテストメッセージを送信して確認を行います。
詳細については、下記ドキュメントをご覧ください。
テストメッセージを送信する
トラブルシューティング
プッシュ通知に問題がある場合は、KARTE for Appプッシュ通知で問題が発生した時のチェックリストを参考にしてください。
Updated 3 months ago