iOS FCM没有获得推送通知

时间:2016-12-22 08:31:15

标签: ios swift push-notification firebase-cloud-messaging

自从我更新到swift 3后,FCM无法正常工作。

Push Notifications中启用了

Capabilities,并在Firebase控制台上更新了证书。

顺便说一句,Android应用程序上的fcm工作正常,它正在ios上工作但是在更新swift 3和新的firebase库后,它没有。

AppDelegate.swift:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    let notificationCenter = NotificationCenter.default

    var connectedToFcm: Bool = false

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        application.registerUserNotificationSettings(settings)
        application.registerForRemoteNotifications()

        FIRApp.configure()
        NotificationCenter.default.addObserver(self, selector: #selector(self.tokenRefreshNotification), name: NSNotification.Name.firInstanceIDTokenRefresh, object: nil)

        return true
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        disconnectFromFcm()
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        connectToFcm()
    }

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        print("REGISTRED")
        FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .unknown)
    }

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError
        error: Error ) {
        print("Registration for remote notification failed with error: \(error.localizedDescription)")
    }

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
        print(userInfo)
    }

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        print(userInfo)
    }

    func tokenRefreshNotification(_ notification: Notification) {
        let refreshedToken = FIRInstanceID.instanceID().token()
        if refreshedToken != nil {
            print("InstanceID token: \(refreshedToken!)")
            // Connect to FCM since connection may have failed when attempted before having a token.
            connectToFcm()
        }
    }

    func connectToFcm() {
        guard FIRInstanceID.instanceID().token() != nil else {
            return;
        }
        if connectedToFcm == false {
            FIRMessaging.messaging().disconnect()
            FIRMessaging.messaging().connect { (error) in
                if (error != nil) {
                    self.connectedToFcm = false
                    print("Unable to connect with FCM. \(error)")
                } else {
                    self.connectedToFcm = true
                    print("Connected to FCM.")
                    self.sendTokenToServer()
                }
            }
            return
        }
    }

    func sendTokenToServer() {
        let fcmToken = FIRInstanceID.instanceID().token()
        if self.sharedUser.getToken().characters.count == 0 || fcmToken == nil {
            return
        }
        let params = [
            "reg_id": fcmToken!,
            "dev_id": Config().devId
        ]

        Alamofire.request(Config().fcmUrl, method: .post, parameters: params, encoding: JSONEncoding.default, headers: Config().apiHeaders)
            .validate()
            .responseJSON { response in
                if response.result.isSuccess {
                    print("FCM token send to app server")
                }
            }
    }

    func disconnectFromFcm() {
        FIRMessaging.messaging().disconnect()
        connectedToFcm = false
        print("Disconnected to FCM")
    }
}

日志:

2016-12-22 09:26:34.921315 app[6198:1607437] Firebase automatic screen reporting is enabled. Call +[FIRAnalytics setScreenName:setScreenClass:] to set the screen name or override the default screen class name. To disable automatic screen reporting, set the flag FirebaseAutomaticScreenReportingEnabled to NO in the Info.plist
2016-12-22 09:26:35.056527 app[6198:1607490] [Firebase/Core][I-COR000001] Configuring the default app.
2016-12-22 09:26:35.057: <FIRInstanceID/WARNING> FIRInstanceID AppDelegate proxy enabled, will swizzle app delegate remote notification handlers. To disable add "FirebaseAppDelegateProxyEnabled" to your Info.plist and set it to NO
2016-12-22 09:26:35.057 app[6198] <Debug> [Firebase/Core][I-COR000001] Configuring the default app.
2016-12-22 09:26:35.060: <FIRInstanceID/WARNING> Failed to fetch APNS token Error Domain=com.firebase.iid Code=1001 "(null)"
2016-12-22 09:26:35.064: <FIRMessaging/INFO> FIRMessaging library version 1.2.0
2016-12-22 09:26:35.065598 app[6198:1607526] <FIRAnalytics/INFO> Firebase Analytics v.3501000 started
2016-12-22 09:26:35.067: <FIRMessaging/WARNING> FIRMessaging AppDelegate proxy enabled, will swizzle app delegate remote notification receiver handlers. Add "FirebaseAppDelegateProxyEnabled" to your Info.plist and set it to NO
2016-12-22 09:26:35.067 app[6198:] <FIRAnalytics/INFO> Firebase Analytics v.3501000 started
2016-12-22 09:26:35.069638 app[6198:1607526] <FIRAnalytics/INFO> To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled
2016-12-22 09:26:35.069 app[6198:] <FIRAnalytics/INFO> To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled
2016-12-22 09:26:35.073182 app[6198:1607488] <FIRAnalytics/INFO> Successfully created Firebase Analytics App Delegate Proxy automatically. To disable the proxy, set the flag FirebaseAppDelegateProxyEnabled to NO in the Info.plist
2016-12-22 09:26:35.073 app[6198:] <FIRAnalytics/INFO> Successfully created Firebase Analytics App Delegate Proxy automatically. To disable the proxy, set the flag FirebaseAppDelegateProxyEnabled to NO in the Info.plist
2016-12-22 09:26:35.181355 app[6198:1607488] <FIRAnalytics/WARNING> The AdSupport Framework is not currently linked. Some features will not function properly.
2016-12-22 09:26:35.181 app[6198:] <FIRAnalytics/WARNING> The AdSupport Framework is not currently linked. Some features will not function properly.
2016-12-22 09:26:35.198981 app[6198:1607490] <FIRAnalytics/INFO> Firebase Analytics enabled
2016-12-22 09:26:35.199 app[6198:] <FIRAnalytics/INFO> Firebase Analytics enabled
2016-12-22 09:26:35.285: <FIRInstanceID/WARNING> APNS Environment in profile: development
REGISTRED
2016-12-22 09:26:35.387693 app[6198:1607489] [Firebase/Core][I-COR000019] Clearcut post completed.
2016-12-22 09:26:35.387 app[6198] <Debug> [Firebase/Core][I-COR000019] Clearcut post completed.
Connected to FCM.
FCM token send to app server

我制作了打印件以检查应用是否获得令牌,而且确实如此。此外,令牌被发送到服务器,我检查它是否正常,如果服务器正在发送推送。

1 个答案:

答案 0 :(得分:0)

我遇到了与iOS FCM集成相同的问题我已经通过在iOS 10中使用推送通知的最新代码解决了这个问题。

您需要检查设备的操作系统版本并隔离相关代码。

if #available(iOS 10, *)
        {
            let center = UNUserNotificationCenter.current()
            center.delegate = self
            center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in
                if error == nil{
                    UIApplication.shared.registerForRemoteNotifications()
                }
            }
        }else
        {
            // Register for remote notifications
            if #available(iOS 8.0, *) {
                // [START register_for_notifications]
                let settings: UIUserNotificationSettings =
                    UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
                application.registerUserNotificationSettings(settings)
                application.registerForRemoteNotifications()
                // [END register_for_notifications]
            } else {
                // Fallback
                let types: UIRemoteNotificationType = [.alert, .badge, .sound]
                application.registerForRemoteNotifications(matching: types)
            }
        }

将此代码放在一个函数中并从完成启动调用它也注释您的代码。 如果您还有任何问题,请告诉我。

重要提示: - 导入UserNotifications

代表: -

func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings)
    {

        /**
        Allow device to register for remote notification.
        */
        UIApplication.shared.registerForRemoteNotifications()
        FIRMessaging.messaging().subscribe(toTopic: "/topics/test")
    }



    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
    {
        /**
        Send device token to firebase to get the FCM token for pushnotification from firebase.
        */
        FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.prod)
    }