我已经通过FCM在我的两个相关应用程序中成功实现了推送通知,同时尝试实现一些逻辑以在接收到通知时增加徽章编号。
我意识到didReceiveRemoteNotification完全没有调用委托方法,因为我没有得到任何印刷品,但是我确实从willPresentnotification和获得印刷品didReceiveresponse。因此,设置UIApplication.shared.applicationIconBadgeNumber在didFinishLaunchingWithOptions没有任何效果,但在设置它didReceiveresponse一样。
didReceiveRemoteNotification
willPresentnotification
didReceiveresponse
UIApplication.shared.applicationIconBadgeNumber
didFinishLaunchingWithOptions
didReceiveRemoteNotification应该调用文档后的内容,但是通知到达时我永远不会从中得到打印结果。
我尝试注释掉整个didReceiveRemoteNotification方法,并且通知仍在传递。
为什么会这样呢?我想我不太了解在此设置中谁在处理消息。你能帮我澄清一下吗?
AppDelegate方法:
didFinishLaunchingWithOptions:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { window?.tintColor = UIColor.blue // Use Firebase library to configure APIs FirebaseApp.configure() Messaging.messaging().delegate = self Crashlytics().debugMode = true Fabric.with([Crashlytics.self]) // setting up notification delegate if #available(iOS 10.0, *) { //iOS 10.0 and greater UNUserNotificationCenter.current().delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] //Solicit permission from the user to receive notifications UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: { granted, error in DispatchQueue.main.async { if granted { print("didFinishLaunchingWithOptions iOS 10: Successfully registered for APNs") UIApplication.shared.registerForRemoteNotifications() // UIApplication.shared.applicationIconBadgeNumber = 1 AppDelegate.badgeCountNumber = 0 UIApplication.shared.applicationIconBadgeNumber = 0 } else { //Do stuff if unsuccessful... print("didFinishLaunchingWithOptions iOO 10: Error in registering for APNs: \(String(describing: error))") } } }) } else { //iOS 9 let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound] let setting = UIUserNotificationSettings(types: type, categories: nil) UIApplication.shared.registerUserNotificationSettings(setting) UIApplication.shared.registerForRemoteNotifications() // UIApplication.shared.applicationIconBadgeNumber = 1 UIApplication.shared.applicationIconBadgeNumber = 0 print("didFinishLaunchingWithOptions iOS 9: Successfully registered for APNs") } // setting up remote control values let _ = RCValues.sharedInstance GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID Crashlytics().debugMode = true Fabric.with([Crashlytics.self]) // // TODO: Move this to where you establish a user session // self.logUser() var error: NSError? do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) } catch let error1 as NSError{ error = error1 print("could not set session. err:\(error!.localizedDescription)") } do { try AVAudioSession.sharedInstance().setActive(true) } catch let error1 as NSError{ error = error1 print("could not active session. err:\(error!.localizedDescription)") } // goggle only GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID // GIDSignIn.sharedInstance().delegate = self // Facebook SDK return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) // return true }
didReceiveRemoteNotification:
// foreground func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { print("didReceiveRemoteNotification: Received new push Notification") // 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) AppDelegate.badgeCountNumber += userInfo["badge"] as! Int print("AppDelegate.badgeCountNumber is : \(String(describing: AppDelegate.badgeCountNumber))") // UIApplication.shared.applicationIconBadgeNumber = AppDelegate.badgeCountNumber UIApplication.shared.applicationIconBadgeNumber = 10//AppDelegate.badgeCountNumber // Print full message. print("didReceiveRemoteNotification: Push notificationMessage is: \(userInfo)") } // background func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { print("didReceiveRemoteNotification with handler : Received new push Notification while in background") // 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) if let messageID = userInfo[ userDetails.fcmToken] { // working for looged in print("didReceiveRemoteNotification: Message ID: \(messageID)") } // Print full message. print("didReceiveRemoteNotification: Push notificationMessage is: \(userInfo)") AppDelegate.badgeCountNumber += userInfo["badge"] as! Int print("AppDelegate.badgeCountNumber is : \(String(describing: AppDelegate.badgeCountNumber))") UIApplication.shared.applicationIconBadgeNumber += userInfo["badge"] as! Int completionHandler(UIBackgroundFetchResult.newData) }
我终于找到了解决方案。需要"content_available": true在从App2向App1发送功能的发布后的警报定义中设置警报,否则将传递通知,但不会调用’didReceiveRemoteNotification’并且您不能使用’userInfo’。希望这对其他人有帮助,因为我没有找到有关此问题的太多信息。如果您使用Postman或类似工具设置通知,请在此处检查didReceiveRemoteNotification函数是否不使用FCM通知服务器调用,因为这是我发现的唯一关于此问题并解决了我问题的帖子。感谢@Ranjani尝试帮助我。
"content_available": true
let postParams: [String : Any] = [ "to": receiverToken, "notification": [ "badge" : 1, "body": body, "title": title, "subtitle": subtitle, "sound" : true, // or specify audio name to play "content_available": true, // this will call didReceiveRemoteNotification in receiving app, else won't work "priority": "high" ], "data" : [ "data": "ciao", ] ]