I'm developing an iOS app that should receive push notifications sent from the Firebase console. I'm using Swift 3 and iOS 10.
As recommended by the Firebase documentation, we must assign our delegate object to the UNUserNotificationCenter
object to receive and display notifications, and the FIRMessaging
object to receive data messages, before our app finishes launching.
This has been done in the didFinishLaunchingWithOptions
method. I followed all the steps in order to configure Firmessaging as well as APNs.
Now, when I send a message from the Firebase console, I receive it through applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage)
method.
The problem is that I could not extract the body of the message from the remoteMessage.appData
dictionary. 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]
Printing
remoteMessage.appData["notification"]
shows
{
body = Hello Notifications;
e = 1;
}
I tried
remoteMessage.appData["notification"]["body"]
and
remoteMessage.appData["notification"].body
but it results in syntax error. I could not extract the body in order to show it in an alert controller. The code of the appDelegate is given 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)
}
For Apple client apps, you can receive notification and data payloads up to 4000 bytes over the Firebase Cloud Messaging APNs interface.
Turn on notifications for Android devicesTap Turn on notifications. Tap Notifications. Tap Show notifications.
Firebase notifications behave differently depending on the foreground/background state of the receiving app. If you want foregrounded apps to receive notification messages or data messages, you'll need to write code to handle the onMessageReceived callback.
You can send notification messages using the Notifications composer in the Firebase console. Though this does not provide the same flexibility or scalability as sending messages with the Admin SDK or the HTTP and XMPP protocols, it can be very useful for testing or for highly targeted marketing and user engagement.
Thanks Arthur Thompson for your help, you gave me the idea. I post the answer in case someone else need it. I wrote
let d : [String : Any] = remoteMessage.appData["notification"] as! [String : Any]
let body : String = d["body"] as! String
print(body)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With