Я успешно внедрил push-уведомления в двух связанных приложениях через FCM и при попытке реализовать некоторую логику для увеличения номера значка при получении уведомления.
Я понял, что didReceiveRemoteNotification
метод делегата вообще не вызывается, так как я не получаю из него отпечатков, но я получаю отпечатки из willPresent notification
и didReceive response
. Поэтому настройка UIApplication.shared.applicationIconBadgeNumber
в didFinishLaunchingWithOptions
не имеет никакого эффекта, но настройка в didReceive response
делает.
В соответствии с документацией 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)
}