Buka konsol

Menerima pesan dalam aplikasi iOS

Setelah diinstal pada perangkat, aplikasi klien bisa menerima pesan melalui antarmuka APN FCM. Anda dapat segera mulai mengirim notifikasi ke segmen pengguna dengan Notifications composer, atau server aplikasi Anda dapat mengirim pesan dengan payload notifikasi melalui antarmuka APN.

Menangani pesan yang diterima melalui antarmuka APN FCM kemungkinan akan mencakup sebagian besar kasus penggunaan biasa. Untuk kasus penggunaan khusus yang menuntut keandalan sangat tinggi, Anda dapat menangani pesan saluran FCM langsung di aplikasi Anda. Anda juga dapat mengirim pesan upstream.

Menangani pesan yang diterima melalui antarmuka APN FCM

Ketika aplikasi Anda berada di latar belakang, iOS akan mengarahkan pesan dengan kunci notification ke baki sistem. Tap pada notification akan membuka aplikasi, dan konten notification diteruskan ke callback didReceiveRemoteNotification di AppDelegate.

Implementasikan AppDelegate application:didReceiveRemoteNotification: seperti berikut:

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

Jika Anda ingin membuka aplikasi dan melakukan tindakan tertentu, tetapkan click_action di payload notification. Gunakan nilai yang ingin digunakan untuk kunci category dalam payload APN.

Menafsirkan payload pesan notifikasi

Payload pesan notifikasi adalah kamus kunci dan nilai. Pesan notifikasi yang dikirim melalui APN mengikuti format payload APN seperti di bawah ini:

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

Menangani pesan saat method swizzling nonaktif

Jika method swizzling nonaktif, Anda harus memanggil metode agar FCM melacak pengiriman pesan dan analisis. Proses ini akan berjalan secara otomatis jika method swizzling aktif.

Pada iOS 10 dan yang lebih baru, Anda dapat menetapkan delegasi UNUserNotificationCenter untuk menerima notifikasi tampilan dari Apple dan properti delegate milik FIRMessaging untuk menerima pesan data dari FCM. Jika Anda tidak menetapkan kedua delegasi ini dengan AppDelegate, metode swizzling untuk penanganan pesan dinonaktifkan. Anda harus memanggil appDidReceiveMessage: untuk melacak pengiriman dan analisis pesan.

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 dan yang lebih lama

// 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 dan yang lebih lama

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
   }
 

Menangani pesan saluran FCM langsung

Untuk menerima pesan data saja yang diam secara langsung dari FCM dengan baik, dengan mengabaikan APN saat aplikasi berada di latar depan, Anda harus terhubung ke layanan FCM dan menangani pesan dengan metode messaging:didReceiveMessage: dari FIRMessagingDelegate. Dengan mengaktifkan saluran langsung, backend FCM akan menggunakan antrean pesan yang andal untuk melacak pesan yang tertunda saat aplikasi berada di latar belakang atau tertutup. Begitu aplikasi pindah ke latar deapan dan koneksi kembali dibuat, saluran akan secara otomatis mengirim pesan yang tertunda ke klien hingga dinyatakan diterima oleh klien.

Agar terhubung, setel tanda shouldEstablishDirectChannel ke YES di AppDelegate. FCM mengelola koneksi tersebut, menutupnya saat aplikasi Anda berpindah ke latar belakang, dan membukanya kembali setiap kali aplikasi berada di latar depan.

Selain itu, tetapkan tanda useMessagingDelegateForDirectChannel ke YES di AppDelegate dan implementasikan messaging:didReceiveMessage:. Aplikasi Anda tetap dapat menerima pesan APN dengan atau tanpa callback ini, tetapi untuk pesan langsung dari FCM, Anda akan membutuhkan callback.

Menafsirkan payload pesan data

Payload pesan data adalah kamus kunci dan nilai. Pesan data yang dikirim ke perangkat secara langsung oleh server FCM dinyatakan dalam format kamus seperti berikut ini:

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

Menangani pesan antrean dan yang telah dihapus

Aplikasi yang terhubung ke FCM untuk menerima pesan data harus menangani FIRMessagingMessagesDeletedNotification. Anda mungkin menerima callback ini jika ada terlalu banyak pesan (> 100) yang tertunda untuk aplikasi Anda di perangkat tertentu saat terhubung atau jika perangkat belum terhubung ke FCM lebih dari 1 bulan. Saat menerima callback ini, instance aplikasi harus melakukan sinkronisasi penuh dengan server aplikasi.

Untuk insight tentang pengiriman pesan ke aplikasi Anda, lihat dasbor pelaporan FCM, yang mencatat jumlah pesan yang dikirim dan dibuka di perangkat iOS dan Android, beserta data untuk "tayangan" (notifikasi yang dilihat oleh pengguna) untuk aplikasi Android.