FCM推送通知在iOS 11上无法工作

3

我需要处理推送通知,这在较低版本的iOS中已完成,但在iOS 11中从未收到任何推送通知。我正在使用Firebase Cloud Messaging。如果有人有解决方案,请分享。

3个回答

10
请查看以下内容:

请检查enter image description here

enter image description here

该内容涉及IT技术,请查看以上图片。
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) {




}

嘿,我使用了 FirebaseInstanceID',"2.0.0" 甚至是最新的 pod,但是没有收到通知,请问你能指导我如何解决这个问题吗? - Vijayvir Sing Pantlia
1
经过大量搜索,我只使用了最新版本或默认版本的Pod,然后检查了一下,在我的这一侧工作,有证书问题或有时FCM令牌问题,请检查。 - Kiran Sarvaiya
我正在使用的Pem文件在其他在线门户中可以正常工作。我已经添加到FCM中,但是这里显示消息已发送,但我没有在我的设备上收到。这就是我现在面临的问题。 - Vijayvir Sing Pantlia
你是通过 FCM 令牌还是其他方式发送通知的? - Kiran Sarvaiya
是的,我正在使用那个。你能给我你的Skype ID吗?或者发邮件给我:vijayvir.smartitventures@gmail.com - Vijayvir Sing Pantlia
节约我的时间,兄弟。 - Mr.Javed Multani

1
问题似乎出在以下方面:
  • FirebaseInstanceID版本低于1.0.9

  • FirebaseInstanceID版本在2.0.1 - 2.0.3之间

请将您的pod文件设置如下:

对于Swift 2.3和Xcode 8:(安装FirebaseInstanceID v1.1.0)

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

对于Swift 3和Xcode 9:
pod 'Firebase/Core'
pod 'Firebase/Messaging'
pod 'FirebaseInstanceID', "2.0.0

我不想升级到 FirebaseInstanceID 2.0.0 来解决这个问题,因为我只想使用 Swift 2.3。


0

我曾经遇到过同样的问题,原因是在 Firebase 控制台中缺少了我的 APN 配置。


嗨,你不能在答案中提出问题。如果你遇到同样的问题,请检查答案;否则,请使用你的配置创建新的问题。 - Kiran Sarvaiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接