iOS アプリでメッセージを受信する

クライアント アプリが端末にインストールされると、アプリは FCM APNs インターフェースを通じてメッセージを受信できます。Notification Composer を使用してユーザー セグメントへの通知の送信をすぐに開始するだけでなく、アプリケーション サーバーから APNs インターフェースを介して通知ペイロードを伴うメッセージを送信することもできます。

最も一般的なユースケースでも、FCM APNs インターフェースを介して受信したメッセージの処理を行う場合があります。アップストリーム メッセージを送信したり、フォアグラウンド アプリでデータ メッセージを受信したりすることもできます。

FCM APNs インターフェースを介して受信したメッセージを処理する

アプリがバックグラウンドで動作しているとき、iOS では notification キーを含むメッセージがシステムトレイに送られます。通知をタップすると、アプリが開き、通知の内容が AppDelegatedidReceiveRemoteNotification コールバックに渡されます。

次のように AppDelegate application:didReceiveRemoteNotification: を実装します。

Swift

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)

  completionHandler(UIBackgroundFetchResult.newData)
}

Objective-C

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Print message ID.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // Print full message.
  NSLog(@"%@", userInfo);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Print message ID.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler(UIBackgroundFetchResultNewData);
}

アプリを開いて特定の操作を行う場合は、click_action通知ペイロードに設定します。この値は、APNs ペイロードの category キーに使うものと同じ値を使用します。

通知メッセージ ペイロードの解釈

両方の通知メッセージのペイロードは、キーと値の辞書です。APNs 経由で送信される通知メッセージは、次のような APNs ペイロード形式になります。

  {
    "aps" : {
      "alert" : {
        "body" : "great match!",
        "title" : "Portugal vs. Denmark",
      },
      "badge" : 1,
    },
    "customKey" : "customValue"
  }

フォアグラウンド アプリでデータ メッセージを処理する

アプリがフォアグラウンドで動作しているときに APNs 経由ではなく FCM から直接データのみのメッセージを受信するには、FCM サービスに接続して、AppDelegate applicationReceivedRemoteMessage: でメッセージを処理する必要があります。

接続するには、shouldEstablishDirectChannelAppDelegate フラグを YES に設定します。接続は FCM によって管理されます。アプリがバックグラウンドになると接続が閉じ、アプリがフォアグラウンドになると再び開きます。

アプリがフォアグラウンドで動作しているときにデータ メッセージを受信するには、applicationReceivedRemoteMessage: を実装します。バックグラウンドで動作しているときには、このコールバックを使用しなくてもデータ メッセージを受信できますが、フォアグラウンドの場合は処理を行う必要があります。

メソッド実装入れ替えが無効にされたメッセージを処理する

メソッド実装入れ替えを無効にしている場合は、appDidReceiveMessage: メソッドを呼び出す必要があります。これにより FCM によるメッセージ配信とアナリティクスの追跡が可能になります。メソッド実装入れ替えが有効になっている場合、この処理は自動的に行われます。

Objective-C

// With "FirebaseAppDelegateProxyEnabled": NO
   - (void)application:(UIApplication *)application
     didReceiveRemoteNotification:(NSDictionary *)userInfo
           fetchCompletionHandler:
               (void (^)(UIBackgroundFetchResult))completionHandler {
   // Let FCM know about the message for analytics etc.
   [[FIRMessaging messaging] appDidReceiveMessage:userInfo];
   // handle your message.
 }
 

Swift

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
     // Let FCM know about the message for analytics etc.
     FIRMessaging.messaging().appDidReceiveMessage(userInfo)
     // handle your message
   }
 

データ メッセージ ペイロードの解釈

データ メッセージのペイロードは、キーと値の辞書です。FCM サーバーから直接端末に送信されるデータ メッセージは、次のような辞書形式になります。

  {
    "body" : "great match!",
    "title" : "Portugal vs. Denmark",
    "icon" : "myicon"
  }

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。