我需要处理推送通知,这是通过较低版本的ios完成的,但是在ios 11中,从未收到任何推送通知。我使用Firebase Cloud Messaging。请任何人有解决方案,然后请分享。
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) { }