How to get the body of a push notification sent from the Firebase console in iOS 10 and Swift 3?

I am developing an iOS application that should receive push notifications sent from the Firebase console. I am using Swift 3 and iOS 10.

As recommended in the Firebase documentation, we must assign our delegate object UNUserNotificationCenterto an object to receive and display notifications and an object FIRMessagingto receive data messages before our application finishes launching.

This was done in a method didFinishLaunchingWithOptions. I followed all the steps to configure Firmessaging as well as APN.

Now, when I send a message from the Firebase console, I get it using the method applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage).

The problem is that I could not extract the message body from the dictionary remoteMessage.appData. Knowing that the body is within remoteMessage.appData["notification"]. Indeed, the instruction

print(remoteMessage.appData)

prints

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

Print

 remoteMessage.appData["notification"]

shows

{
   body = Hello Notifications;
   e = 1;
}

I tried

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

and

 remoteMessage.appData["notification"].body

but this leads to a syntax error. I could not remove the body to show it in the controller. The appDelegate code is below.

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 ?????", preferredStyle: .alert)
    let OKAction = UIAlertAction(title: "OK", style: .default) { (action:UIAlertAction!) in
    }
    alertController.addAction(OKAction)
    self.window?.rootViewController?.present(alertController, animated: true, completion: nil)
}
+4
source share
4 answers

Thanks to Arthur Thompson for your help, you gave me this idea. I send an answer if someone needs it. I wrote

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

You can get the body using something like:

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

:

let response = remoteMessage.appData

print(response[AnyHashable("notification")] as Any)

Apple AnyHashable: https://developer.apple.com/reference/swift/anyhashable

0

Firebase , . (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("=====")
0

Source: https://habr.com/ru/post/1656869/


All Articles