¿Cómo get el cuerpo de una notificación push enviada desde la console de Firebase en iOS 10 y Swift 3?

Estoy desarrollando una aplicación de iOS que debería recibir notifications push enviadas desde la console de Firebase. Estoy usando Swift 3 y iOS 10.

Según lo recomendado por la documentation de Firebase, debemos asignar nuestro object delegado al object UNUserNotificationCenter para recibir y mostrar notifications, y el object FIRMessaging para recibir posts de datos, antes de que nuestra aplicación termine de iniciarse.

Esto se ha hecho en el método didFinishLaunchingWithOptions . Seguí todos los pasos para configurar Firmessaging y también APN.

Ahora, cuando envío un post desde la console de Firebase, lo recibo a través del método applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) .

El problema es que no pude extraer el cuerpo del post del dictionary remoteMessage.appData . Saber que el cuerpo está dentro de remoteMessage.appData["notification"] . De hecho, las instrucciones

 print(remoteMessage.appData) 

huellas dactilares

 [AnyHashable("notification"): { body = Hello Notifications; e = 1; }, AnyHashable("from"): 49679924394, AnyHashable("collapse_key"): com.company.app] 

Impresión

  remoteMessage.appData["notification"] 

muestra

 { body = Hello Notifications; e = 1; } 

Lo intenté

 remoteMessage.appData["notification"]["body"] 

y

  remoteMessage.appData["notification"].body 

pero da como resultado un error de syntax. No pude extraer el cuerpo para mostrarlo en un controller de alerta. El código de la aplicaciónDelegate se proporciona a continuación.

 class AppDelegate: UIResponder, UIApplicationDelegate, FIRMessagingDelegate, UNUserNotificationCenterDelegate{ ...... func application(_ application: UIApplication, didFinishLaunchingWithOptions, launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { application.isStatusBarHidden = true FIRApp.configure() FIRDatabase.database().persistenceEnabled = true if #available(iOS 10.0, *) { let authOptions : UNAuthorizationOptions = [.alert, .badge, .sound] let center = UNUserNotificationCenter.current() center.requestAuthorization(options: authOptions, completionHandler: {_ ,_ in }) application.registerForRemoteNotifications() // For iOS 10 display notification (sent via APNS) UNUserNotificationCenter.current().delegate = self // For iOS 10 data message (sent via FCM) FIRMessaging.messaging().remoteMessageDelegate = self } else { let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) application.registerUserNotificationSettings(settings) } application.registerForRemoteNotifications() return true } // Receive data message on iOS 10 devices. func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) { print(remoteMessage.appData) print(remoteMessage.appData["notification"]!) let alertController = UIAlertController(title: "Message from IOBird Developer Team", message: "?????? Body of the message ?????", prefernetworkingStyle: .alert) let OKAction = UIAlertAction(title: "OK", style: .default) { (action:UIAlertAction!) in } alertController.addAction(OKAction) self.window?.rootViewController?.present(alertController, animated: true, completion: nil) } 

Gracias a Arthur Thompson por tu ayuda, me diste la idea. Publico la respuesta en caso de que alguien más lo necesite. escribí

 let d : [String : Any] = remoteMessage.appData["notification"] as! [String : Any] let body : String = d["body"] as! String print(body) 

Debería poder recuperar el cuerpo usando algo como:

 let body = remoteMessage.appData["notification"]!["body"] as! String print(body) 

Debería poder imprimir cualquier línea de la respuesta con esto:

 let response = remoteMessage.appData print(response[AnyHashable("notification")] as Any) 

La documentation de Apple en AnyHashable: https://developer.apple.com/reference/swift/anyhashable

Tuve exactamente el mismo problema con los posts de Firebase y extraigo los datos, y esto funciona como un hechizo. (Swift 3)

  print("====") let d : [String : Any] = remoteMessage.appData["notification"] as! [String : Any] let body : String = d["body"] as! String let click_action : String = d["click_action"] as! String let title : String = d["title"] as! String print(body) print(title) print(click_action) print("=====")