在ios 10上未收到Firebase通知

时间:2017-08-28 12:34:33

标签: ios firebase firebase-cloud-messaging

我正在使用firebase在iOS中实现推送通知。不幸的是,我遇到firebase没有收到通知的问题。

这是我输出的错误:

****[Firebase/Messaging][I-FCM002019] FIRMessaging received data message, but FIRMessagingDelegate's-messaging:didReceiveMessage: not implemented****

如何解决此问题?我已经在iOS 9.3上测试了它,它运行正常。我使用以下代码:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
    {
        FirebaseApp.configure()
        if #available(iOS 10.0, *) {
            // For iOS 10 display notification (sent via APNS)
            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()
        // Add observer for InstanceID token refresh callback.
        NotificationCenter.default
            .addObserver(self, selector: #selector(AppDelegate.tokenRefreshNotification),
                         name: NSNotification.Name.InstanceIDTokenRefresh, object: nil)
  return true
}
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any])
    {
        print(userInfo)
}
    func tokenRefreshNotification(_ notification: UIViewController)
    {
        if let refreshedToken = InstanceID.instanceID().token()
        {
            print("InstanceID token: \(refreshedToken)")
            UserDefaults.standard.set(refreshedToken, forKey: "Device_token")
            UserDefaults.standard.synchronize()
        }
        // Connect to FCM since connection may have failed when attempted before having a token.
        connectToFcm()
    }

    // [START connect_to_fcm]
    func connectToFcm()
    {
        Messaging.messaging().shouldEstablishDirectChannel = true
    }

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

        //Tricky line
        Messaging.messaging().apnsToken = deviceToken
        //InstanceID.instanceID().setAPNSToken(deviceToken, type: InstanceIDAPNSTokenType.unknown)
        print("Device Token:", tokenString)
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        print("applicationDidBecomeActive ")

        connectToFcm()
    }

1 个答案:

答案 0 :(得分:1)

您尚未为 IOS 10添加委托方法,还检查您的有效负载是否为mutable-content = true

 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()

// [START set_messaging_delegate]
Messaging.messaging().delegate = self
// [END set_messaging_delegate]
// Register for remote notifications. This shows a permission dialog on 
 first run, to
// show the dialog at a more appropriate time move this registration 
 accordingly.
  // [START register_for_notifications]
   if #available(iOS 10.0, *) {
  // For iOS 10 display notification (sent via APNS)
   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()

// [END register_for_notifications]
return true
}

 // [START receive_message]
 func application(_ application: UIApplication, 
 didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
// If you are receiving a notification message while your app is in the 
background,
// this callback will not be fired till the user taps on the 
 notification launching the application.
// TODO: Handle data of notification
// With swizzling disabled you must let Messaging know about the 
 message, for Analytics
// Messaging.messaging().appDidReceiveMessage(userInfo)
// Print message ID.
    if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
   }

   // Print full message.
    print(userInfo)
  }

  func application(_ application: UIApplication, 
  didReceiveRemoteNotification userInfo: [AnyHashable: Any],
               fetchCompletionHandler completionHandler: @escaping 
  (UIBackgroundFetchResult) -> Void) {
// If you are receiving a notification message while your app is in the 
  background,
// this callback will not be fired till the user taps on the 
 notification launching the application.
// TODO: Handle data of notification
// With swizzling disabled you must let Messaging know about the 
message, for Analytics
// Messaging.messaging().appDidReceiveMessage(userInfo)
// Print message ID.
if let messageID = userInfo[gcmMessageIDKey] {
  print("Message ID: \(messageID)")
}

// Print full message.
print(userInfo)

completionHandler(UIBackgroundFetchResult.newData)
}
// [END receive_message]
 func application(_ application: UIApplication, 
 didFailToRegisterForRemoteNotificationsWithError error: Error) {
  print("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 FCM registration token.
 func application(_ application: UIApplication, 
 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
 print("APNs token retrieved: \(deviceToken)")

// With swizzling disabled you must set the APNs token here.
// Messaging.messaging().apnsToken = deviceToken
 }
 }

 // [START ios_10_message_handling]
 @available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {

// Receive displayed notifications for iOS 10 devices.
func userNotificationCenter(_ center: UNUserNotificationCenter,
                          willPresent notification: UNNotification,
   withCompletionHandler completionHandler: @escaping 
  (UNNotificationPresentationOptions) -> Void) {
  let userInfo = notification.request.content.userInfo

  // With swizzling disabled you must let Messaging know about the 
  message, for Analytics
 // Messaging.messaging().appDidReceiveMessage(userInfo)
 // Print message ID.
 if let messageID = userInfo[gcmMessageIDKey] {
  print("Message ID: \(messageID)")
 }

 // Print full message.
 print(userInfo)

 // Change this to your preferred presentation option
 completionHandler([])
 }

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

 // Print full message.
 print(userInfo)

  completionHandler()
  }
 }
 // [END ios_10_message_handling]

 extension AppDelegate : MessagingDelegate {
 // [START refresh_token]
 func messaging(_ messaging: Messaging, didRefreshRegistrationToken 
 fcmToken: String) {
  print("Firebase registration token: \(fcmToken)")
  }
// [END refresh_token]
// [START ios_10_data_message]
// Receive data messages on iOS 10+ directly from FCM (bypassing APNs) 
when the app is in the foreground.
 // To enable direct data messages, you can set 
  Messaging.messaging().shouldEstablishDirectChannel to true.
  func messaging(_ messaging: Messaging, didReceive remoteMessage: 
  MessagingRemoteMessage) {
   print("Received data message: \(remoteMessage.appData)")
   }
   // [END ios_10_data_message]
 }

或点击此链接: -

https://github.com/firebase/quickstart-
 ios/blob/master/messaging/MessagingExampleSwift/AppDelegate.swift