2017-08-02 160 views
0

我是IOS開發新手。Swift3無法接收背景FCM推送通知

我已經在谷歌搜索了2天。

我無法通過FCM接收後臺推送通知。

在前臺,收到但在後臺,不叫委託。

選中的功能 - >推送通知,背景模式。

我將high和content_available的優先級設置爲true。

使用swift3,ios10.3,firebase。

這是我的代碼。

import UIKit 
import UserNotifications 
import Firebase 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    let gcmMessageIDKey = "gcm.message_id" 

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

    Messaging.messaging().delegate = self 
    if #available(iOS 10.0, *) { 
     UNUserNotificationCenter.current().delegate = self 

     let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] 
     UNUserNotificationCenter.current().requestAuthorization(
      options: authOptions, 
      completionHandler: {_, _ in }) 
    } else { 
     let settings: UIUserNotificationSettings = 
      UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) 
     application.registerUserNotificationSettings(settings) 
    } 

    application.registerForRemoteNotifications() 
    return true 
} 
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { 
    if let messageID = userInfo[gcmMessageIDKey] { 
     print("Message ID: \(messageID)") 
    } 

    print(userInfo) 
} 
    func applicationDidBecomeActive(_ application: UIApplication) 
    { 
     Messaging.messaging().shouldEstablishDirectChannel = true 

     application.applicationIconBadgeNumber = 0; 
    } 

    func applicationDidEnterBackground(_ application: UIApplication) 
    { 
     Messaging.messaging().shouldEstablishDirectChannel = false 
     print("Disconnected from FCM.") 
    } 
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], 
       fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 
    if let messageID = userInfo[gcmMessageIDKey] { 
     print("Message ID: \(messageID)") 
    } 

    print(userInfo) 

    completionHandler(UIBackgroundFetchResult.newData) 
} 
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { 
    print("Unable to register for remote notifications: \(error.localizedDescription)") 
} 

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
    print("APNs token retrieved: \(deviceToken)") 

} 
} 

@available(iOS 10, *) 
extension AppDelegate : UNUserNotificationCenterDelegate { 

func userNotificationCenter(_ center: UNUserNotificationCenter, 
          willPresent notification: UNNotification, 
          withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
    let userInfo = notification.request.content.userInfo 

    if let messageID = userInfo[gcmMessageIDKey] { 
     print("Message ID: \(messageID)") 
    } 

    print(userInfo) 

    completionHandler([]) 
} 

func userNotificationCenter(_ center: UNUserNotificationCenter, 
          didReceive response: UNNotificationResponse, 
          withCompletionHandler completionHandler: @escaping() -> Void) { 
    let userInfo = response.notification.request.content.userInfo 
    if let messageID = userInfo[gcmMessageIDKey] { 
     print("Message ID: \(messageID)") 
    } 

    print(userInfo) 

    completionHandler() 
} 
} 

extension AppDelegate : MessagingDelegate { 
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) { 
    print("Firebase registration token: \(fcmToken)") 
} 
func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) { 
    print("Received data message: \(remoteMessage.appData)") 
} 
} 

回答

0

在你的函數:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 

您收到deviceToken但它什麼都不做,你需要將其發送到火力地堡。

導入實例ID:

import FirebaseInstanceID 

而且試試這個:

func application(
    _ application:UIApplication, 
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken:Data) 
{ 
    FIRInstanceID.instanceID().setAPNSToken(
     deviceToken as Data, 
     type:.unknown) 
} 
0

添加在的appdelegate:

func application(_ application: UIApplication, 
        didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
    Messaging.messaging().apnsToken = deviceToken as Data 
    }