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

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

最も一般的なユースケースはおそらく、FCM APNs インターフェースを介して受信したメッセージの処理を行うケースです。非常に高い信頼性が要求される特別なユースケースでは、ダイレクト FCM チャネル メッセージを処理できます。さらに、アップストリーム メッセージを送信することもできます。

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

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

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

iOS 10 以降で Apple から表示通知を受信するには UNUserNotificationCenter delegate を設定し、FCM からデータ メッセージを受信するには、FIRMessagingdelegate プロパティを設定します。この 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 チャネル メッセージを処理する

アプリがフォアグラウンドで動作しているときに APNs をバイパスして、通知を含まないデータのみのメッセージを FCM から直接、確実に受信するには、FCM サービスに接続して、FIRMessagingDelegatemessaging:didReceiveMessage: メソッドでメッセージを処理する必要があります。ダイレクト チャネルを有効にすると、FCM バックエンドが信頼性の高いメッセージ キューを使用して、アプリがバックグラウンドで動作しているときや閉じているときに保留中のメッセージを追跡します。アプリがフォアグラウンドになり、接続が再確立されると、保留中のメッセージが自動的にクライアントに送信されます。これは、クライアントから確認応答を受け取るまで続けられます。

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

また、AppDelegateuseMessagingDelegateForDirectChannel フラグを YES に設定し、messaging:didReceiveMessage: を実装します。このコールバックは、APNs メッセージを受信するには特に必要ありませんが、FCM から直接メッセージを受信するには必要です。

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

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

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

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

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

アプリへのメッセージ配信については、FCM レポート ダッシュボードをご覧ください。このダッシュボードには、Android アプリの「インプレッション」(ユーザーが表示した通知)のデータとともに、iOS と Android のデバイスで送信および開封されたメッセージの数が記録されています。

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

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