1

我需要处理推送通知,并使用较低版本的ios完成,但在ios 11中从未收到任何推送通知。我使用Firebase云消息传递。请任何人有解决方案,然后请分享。FCM推送通知不适用于iOS 11

回答

4

请检查为 enter image description here

enter image description here

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

哎,我习惯FirebaseInstanceID”,“2.0。 0“,甚至最新的豆荚,但没有得到通知,你能指导我,如何修复这个 –

+1

很多搜​​索后,我只是使用最新版本或默认版本的豆荚,然后检查这是在我身边的工作有证书问题或某些时候FCM令牌问题PLZ检查 –

+0

我正在使用的Pem文件正在其他在线门户中工作。我已经在FCM中添加了,但在这里显示消息已发送,但我没有收到我的设备。现在的问题,我面临 –

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 

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