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 サービスに接続して、FIRMessagingDelegatemessaging:didReceiveMessage: でメッセージを処理する必要があります。

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

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

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

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

iOS 10 以降、Apple から表示通知を受信するには UNUserNotificationCenter delegate を設定し、FCM からデータ メッセージを受信するには、FIRMessaging remoteMessageDelegate を設定します。この 2 つのデリゲートを AppDelegate で設定しない場合、メッセージを処理するときのメソッド実装入れ替えは無効になります。メッセージ配信とアナリティクスを追跡するには、appDidReceiveMessage: メソッドを呼び出す必要があります。

Objective-C: iOS 10

// Receive displayed notifications for iOS 10 devices.
// Handle incoming notification messages while app is in the foreground.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
  NSDictionary *userInfo = notification.request.content.userInfo;

  // 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);

  // Change this to your preferred presentation option
  completionHandler(UNNotificationPresentationOptionNone);
}

// Handle notification messages after display notification is tapped by the user.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void(^)(void))completionHandler {
  NSDictionary *userInfo = response.notification.request.content.userInfo;
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

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

  completionHandler();
}

Objective-C: iOS 9

// 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: iOS 10

@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {

  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification,
    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    let userInfo = notification.request.content.userInfo

    // 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)

    // Change this to your preferred presentation option
    completionHandler([])
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo
    // Print message ID.
    if let messageID = userInfo[gcmMessageIDKey] {
      print("Message ID: \(messageID)")
    }

    // Print full message.
    print(userInfo)

    completionHandler()
  }
}

Swift: iOS 9

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"
  }

キューに格納されたメッセージと削除されたメッセージを処理する

FCM に接続してデータ メッセージを受信するアプリでは、FIRMessagingMessagesDeletedNotification を処理する必要があります。特定の端末が接続されたときにその端末にまだ配信されていないアプリのメッセージが多すぎる(100 件を超えている)場合や、端末が 1 か月以上 FCM に接続されていない場合に、このコールバックを受け取ることがあります。アプリ インスタンスがこのコールバックを受け取った場合は、アプリサーバーとの完全な同期を実行する必要があります。

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

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