FCM Push notification not working in iOS 11

后端 未结 3 1144
天涯浪人
天涯浪人 2020-12-19 22:48

I need to handle push notification and that\'s done with a lower version of ios but in ios 11 never receive any push notification. I using Firebase Cloud Messaging. please,

相关标签:
3条回答
  • 2020-12-19 23:33

    Problem seems to be with

    • FirebaseInstanceID Version less than 1.0.9

    • FirebaseInstanceID Version between 2.0.1 - 2.0.3

    Set your pod file as below :

    For Swift 2.3 and Xcode 8 : (FirebaseInstanceID v1.1.0 gets installed)

    pod 'Firebase/Core', '3.8.0'
    pod 'Firebase/Messaging'
    

    For Swift 3 and Xcode 9 :

    pod 'Firebase/Core'
    pod 'Firebase/Messaging'
    pod 'FirebaseInstanceID', "2.0.0
    

    I didn't want to upgrade to FirebaseInstanceID 2.0.0 to fix the issue as I wanted use Swift 2.3 only

    0 讨论(0)
  • 2020-12-19 23:41

    I had the same problem, the issue was I was missing my APN configuration in firebase console.

    0 讨论(0)
  • 2020-12-19 23:51

    Please Check as

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Use Firebase library to configure APIs
        FirebaseApp.configure()
        self.registerForPushNotifications(application: application)
        Messaging.messaging().delegate = self
    
        if let token = InstanceID.instanceID().token() {
            NSLog("FCM TOKEN : \(token)")
            DataModel.sharedInstance.onSetUserFCMStringToken(FCM: token)
            self.connectToFcm()
        }
        if launchOptions != nil {
            //opened from a push notification when the app is closed
            _ = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [AnyHashable: Any] ?? [AnyHashable: Any]()
        }
        else {
            //opened app without a push notification.
        }
        return true
    }
    

    @available(iOS 10, *)

    extension AppDelegate: UNUserNotificationCenterDelegate {
    // iOS10+, called when presenting notification in foreground
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        let userInfo = notification.request.content.userInfo
        NSLog("[UserNotificationCenter] willPresentNotification: \(userInfo)")
        //TODO: Handle foreground notification
        completionHandler([.alert])
    }
    
    // iOS10+, called when received response (default open, dismiss or custom action) for a notification
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        NSLog("[UserNotificationCenter] didReceiveResponse: \(userInfo)")
        //TODO: Handle background notification
        completionHandler()
    }}
    
    extension AppDelegate : MessagingDelegate {
    //MARK: FCM Token Refreshed
    func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
        NSLog("[RemoteNotification] didRefreshRegistrationToken: \(fcmToken)")
    }
    
    // Receive data message on iOS 10 devices while app is in the foreground.
    func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
        NSLog("remoteMessage: \(remoteMessage.appData)")
    }}
    
    //Register for push notification.
    func registerForPushNotifications(application: UIApplication) {
        if #available(iOS 10.0, *) {
            let center  = UNUserNotificationCenter.current()
            center.delegate = self
            center.requestAuthorization(options: [.alert,.sound]) { (granted, error) in
                if error == nil{
                    DispatchQueue.main.async(execute: {
                        application.registerForRemoteNotifications()
                    })
                }
            }
        }
        else {
    
            let settings = UIUserNotificationSettings(types: [.alert,.sound], categories: nil)
            application.registerUserNotificationSettings(settings)
            application.registerForRemoteNotifications()
        }
    
        // Add observer for InstanceID token refresh callback.
        NotificationCenter.default.addObserver(self, selector: #selector(self.tokenRefreshNotification), name: NSNotification.Name.InstanceIDTokenRefresh, object: nil)
    
    }
    
    @objc func tokenRefreshNotification(_ notification: Notification) {
        print(#function)
        if let refreshedToken = InstanceID.instanceID().token() {
            NSLog("Notification: refresh token from FCM -> \(refreshedToken)")
    
        }
        // Connect to FCM since connection may have failed when attempted before having a token.
        connectToFcm()
    }
    
    func connectToFcm() {
        // Won't connect since there is no token
        guard InstanceID.instanceID().token() != nil else {
            NSLog("FCM: Token does not exist.")
            return
        }
    
        Messaging.messaging().shouldEstablishDirectChannel = true
    }
    
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        NSLog("Notification: Unable to register for remote notifications: \(error.localizedDescription)")
    }
    
    
    // This function is added here only for debugging purposes, and can be removed if swizzling is enabled.
    // If swizzling is disabled then this function must be implemented so that the APNs token can be paired to the InstanceID token.
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    
    
        Messaging.messaging().apnsToken = deviceToken
    
    
    }
    
    // iOS9, called when presenting notification in foreground
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
        NSLog("didReceiveRemoteNotification for iOS9: \(userInfo)")
    
    }
    
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    
    
    
    
    }
    
    0 讨论(0)
提交回复
热议问题