iOS 在应用程序处于后台时处理通知和负载
iOS Handle notifications and payload when app is in Background
我正在开发一个 Swift iOS 14 应用程序,用于发送和接收来自 Firebase 云消息传递的推送通知。
我从 FCM 发送一条消息,其中包含必须由应用程序处理的有效负载,使用有效负载数据更新内部 SQLite 数据库以供稍后使用,在视图中显示项目。
当应用程序在前台时,我在 didReceiveRemoteNotification 方法中收到通知并更新数据库,但是当应用程序在后台或被终止时,收到通知但没有调用任何方法来处理负载和更新de 数据库。
我已经阅读了很多关于这个问题的主题,但是在 none 中我找到了解决方案。
目前我不想使用外部数据库插入数据,稍后再读取外部数据库,但如果没有其他选择我会更改应用程序(原因是我不会'不想存储用户应用程序之外的任何信息)。
我的AppDelegate.swift如下:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
//Firebase Auth + APNs
FirebaseApp.configure()
UNUserNotificationCenter.current().delegate = self
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
options: authOptions,
completionHandler: {_, _ in })
application.registerForRemoteNotifications()
Messaging.messaging().delegate = self
return true
}
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
UserDefaults.standard.set(fcmToken, forKey: UserConstants.MESSAGING_TOKEN)
let dataDict:[String: String] = ["token": fcmToken]
NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
if(userInfo["name"] != nil) {
ContactsService.sharedInstance.addAlert(phoneNumber: userInfo["phone"] as! String, name: userInfo["name"] as! String, isLocalized: Bool(userInfo["isLocalized"] as? String), longitude: (userInfo["longitude"] as! NSString).doubleValue, latitude: (userInfo["latitude"] as! NSString).doubleValue)
}
}
有人可以帮助我,告诉我是否可以那样做,或者是否有必要将数据存储在外部以供以后检索?
谢谢!
有两种类型的推送通知,警报通知和后台通知。警报通知允许您发送可见的警报,这些警报可以通过您的应用程序可以 customize.Background 通知的方式进行交互,允许您的应用程序在收到推送通知后从后台获取数据。应使用后台通知来使您的应用程序保持最新状态,即使该应用程序不是 运行。同样从 ios 10(及更高版本)开始,您可以使用 didReceive 方法来处理警报通知,而不是使用 didReceiveRemoteNotification 方法。
现在回到您的问题,如果出现警报通知,当应用程序位于前台或用户点击应用程序时,将调用 didReceive/didReceiveRemoteNotification 方法。因为,你想更新数据库,你可以使用后台通知而不是警报通知,因为它会自动启动你的应用程序,即使它在后台,也会调用 didReceiveRemoteNotification:fetchCompletionHandler .在发送后台推送通知时确保您:
- 编辑 Info.plist 并选中“启用后台模式”和“远程通知”复选框。
- 将“content-available”:1 添加到您的推送通知负载中,否则应用程序在后台时不会被唤醒
- 通知的POST请求应包含值为background的apns-push-typeheader字段和值为5的apns-priority字段
我正在开发一个 Swift iOS 14 应用程序,用于发送和接收来自 Firebase 云消息传递的推送通知。
我从 FCM 发送一条消息,其中包含必须由应用程序处理的有效负载,使用有效负载数据更新内部 SQLite 数据库以供稍后使用,在视图中显示项目。
当应用程序在前台时,我在 didReceiveRemoteNotification 方法中收到通知并更新数据库,但是当应用程序在后台或被终止时,收到通知但没有调用任何方法来处理负载和更新de 数据库。
我已经阅读了很多关于这个问题的主题,但是在 none 中我找到了解决方案。
目前我不想使用外部数据库插入数据,稍后再读取外部数据库,但如果没有其他选择我会更改应用程序(原因是我不会'不想存储用户应用程序之外的任何信息)。
我的AppDelegate.swift如下:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
//Firebase Auth + APNs
FirebaseApp.configure()
UNUserNotificationCenter.current().delegate = self
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
options: authOptions,
completionHandler: {_, _ in })
application.registerForRemoteNotifications()
Messaging.messaging().delegate = self
return true
}
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
UserDefaults.standard.set(fcmToken, forKey: UserConstants.MESSAGING_TOKEN)
let dataDict:[String: String] = ["token": fcmToken]
NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
if(userInfo["name"] != nil) {
ContactsService.sharedInstance.addAlert(phoneNumber: userInfo["phone"] as! String, name: userInfo["name"] as! String, isLocalized: Bool(userInfo["isLocalized"] as? String), longitude: (userInfo["longitude"] as! NSString).doubleValue, latitude: (userInfo["latitude"] as! NSString).doubleValue)
}
}
有人可以帮助我,告诉我是否可以那样做,或者是否有必要将数据存储在外部以供以后检索?
谢谢!
有两种类型的推送通知,警报通知和后台通知。警报通知允许您发送可见的警报,这些警报可以通过您的应用程序可以 customize.Background 通知的方式进行交互,允许您的应用程序在收到推送通知后从后台获取数据。应使用后台通知来使您的应用程序保持最新状态,即使该应用程序不是 运行。同样从 ios 10(及更高版本)开始,您可以使用 didReceive 方法来处理警报通知,而不是使用 didReceiveRemoteNotification 方法。
现在回到您的问题,如果出现警报通知,当应用程序位于前台或用户点击应用程序时,将调用 didReceive/didReceiveRemoteNotification 方法。因为,你想更新数据库,你可以使用后台通知而不是警报通知,因为它会自动启动你的应用程序,即使它在后台,也会调用 didReceiveRemoteNotification:fetchCompletionHandler .在发送后台推送通知时确保您:
- 编辑 Info.plist 并选中“启用后台模式”和“远程通知”复选框。
- 将“content-available”:1 添加到您的推送通知负载中,否则应用程序在后台时不会被唤醒
- 通知的POST请求应包含值为background的apns-push-typeheader字段和值为5的apns-priority字段