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

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

APNs インターフェースだけではなく FCM を通じてメッセージの送受信を行うには、FCM サービスに接続し、AppDelegate application:didReceiveRemoteNotification: を使用してメッセージを処理する必要があります。このページの残りの部分では、iOS クライアント アプリで接続してメッセージを処理する方法について説明します。

FCM に接続する

アプリがアクティブになったときや、新しい登録トークンが使用可能になるたびに接続します。アプリがいったん接続されると、それ以降に接続が試みられても FCM によって無視されます。

Objective-C

- (void)connectToFcm {
  [[FIRMessaging messaging] connectWithCompletion:^(NSError * _Nullable error) {
    if (error != nil) {
      NSLog(@"Unable to connect to FCM. %@", error);
    } else {
      NSLog(@"Connected to FCM.");
    }
  }];
}

Swift

func connectToFcm() {
  FIRMessaging.messaging().connect { (error) in
    if error != nil {
      print("Unable to connect with FCM. \(error)")
    } else {
      print("Connected to FCM.")
    }
  }
}

アプリが接続されると、ダウンストリーム メッセージやアップストリーム メッセージを送信したり、トピック メッセージングや端末グループ宛てのメッセージングを使用できるようになります。アプリがバックグラウンド状態に移ると、FCM から切断します。

Objective-C

- (void)applicationDidEnterBackground:(UIApplication *)application {
  [[FIRMessaging messaging] disconnect];
  NSLog(@"Disconnected from FCM");
}

Swift

func applicationDidEnterBackground(_ application: UIApplication) {
  FIRMessaging.messaging().disconnect()
  print("Disconnected from FCM.")
}

メッセージを処理する

クライアント アプリがフォアグラウンドで動作しているときに受信した通知と、クライアントに送信されるすべてのデータ メッセージを処理するには、AppDelegate application:didReceiveRemoteNotification: を実装します。このメッセージは、キーと値の辞書です。

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

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

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

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

  completionHandler(UIBackgroundFetchResultNewData);
}

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

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

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

  // Print full message.
  print(userInfo)

  completionHandler(UIBackgroundFetchResult.newData)
}

ペイロードに notification を含むメッセージの受信と処理

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

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

iOS 10 でデータ メッセージを受信する

アプリがフォアグラウンドで動作しているときにも iOS 10 端末でデータ メッセージを受信するには、applicationReceivedRemoteMessage: を処理する必要があります。バックグラウンドで動作しているアプリでは、このコールバックがなくてもデータ メッセージを受信できますが、フォアグラウンドの場合は、アプリのデリゲートで次のようなロジックが必要です。
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
// Receive data message on iOS 10 devices while app is in the foreground.
- (void)applicationReceivedRemoteMessage:(FIRMessagingRemoteMessage *)remoteMessage {
  // Print full message
  NSLog(@"%@", remoteMessage.appData);
}
#endif

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

メソッド実装入れ替えを無効にしている場合は、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
   }
 

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