Firebase (FCM) Error al get el token de APNS Error Domain = com.firebase.iid Code = 1001

Estoy intentando utilizar FCM para la notificación.
Pero <FIRInstanceID/WARNING> Error al get Domain=com.firebase.iid Code=1001 "(null)" error de token de APNS Domain=com.firebase.iid Code=1001 "(null)" ocurre así que no puedo recibir notificación. ¿Cuál es el problema?

En la console,
No se pudo get el token de APNS Error Domain=com.firebase.iid Code=1001 "(null)"

y debajo está mi código en Appdelegate

 import UIKit import CoreData import Alamofire import Firebase import FirebaseInstanceID import FirebaseMessaging @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? var badgeCount : Int = 0; enum BasicValidity : String { case Success = "basicInfo" case Fail = "OauthAuthentificationError" } func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. let uns: UIUserNotificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) application.registerUserNotificationSettings(uns) application.registerForRemoteNotifications() FIRApp.configure() NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.tokenRefreshNotification), name: kFIRInstanceIDTokenRefreshNotification, object: nil) if let token = FIRInstanceID.instanceID().token() { sendTokenToServer(token) print("token is < \(token) >:") } return true } func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData){ print("didRegisterForRemoteNotificationsWithDeviceToken()") // if FirebaseAppDelegateProxyEnabled === NO: FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .Sandbox) print("APNS: <\(deviceToken)>") } func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError){ print("Registration for remote notification failed with error: \(error.localizedDescription)") } func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]){ print("didReceiveRemoteNotification()") //if FirebaseAppDelegateProxyEnabled === NO: FIRMessaging.messaging().appDidReceiveMessage(userInfo) // handler(.NoData) } // [START refresh_token] func tokenRefreshNotification(notification: NSNotification) { print("tokenRefreshNotification()") if let token = FIRInstanceID.instanceID().token() { print("InstanceID token: \(token)") sendTokenToServer(token) FIRMessaging.messaging().subscribeToTopic("/topics/global") print("Subscribed to: /topics/global") } connectToFcm() } // [END refresh_token] func sendTokenToServer(currentToken: String) { print("sendTokenToServer() Token: \(currentToken)") // Send token to server ONLY IF NECESSARY } // [START connect_to_fcm] func connectToFcm() { FIRMessaging.messaging().connectWithCompletion { (error) in if error != nil { print("Unable to connect with FCM. \(error!)") } else { print("Connected to FCM.") } } } // [END connect_to_fcm] func applicationWillResignActive(application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } // [START disconnect_from_fcm] func applicationDidEnterBackground(application: UIApplication) { // Use this method to release shanetworking resources, save user data, invalidate timers, and store enough application state information to restre your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. FIRMessaging.messaging().disconnect() print("Disconnected from FCM.") } func applicationWillEnterForeground(application: UIApplication) { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } func applicationDidBecomeActive(application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. // UIApplication.shanetworkingApplication().applicationIconBadgeNumber = 0 connectToFcm() } func applicationWillTerminate(application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. // Saves changes in the application's managed object context before the application terminates. self.saveContext() } 
  • Puedo recibir notifications de Firebase consol si envío notifications utilizando ID de package. Pero no puedo get si nuestro server envía notifications a un dispositivo específico con token.

Para mí, intenté seguir a thigs para que funcione:

  • Habilitaciones de reinicio-> notificación de inserción, uso compartido de llavero y modos de background-> notificación remota
  • Reinstalar la aplicación (esto generará un nuevo token de actualización, será igual para las ejecuciones posteriores, por lo que no se imprimirá cada vez que ejecute la aplicación).
  • Asegúrate de tener el file .p12 correcto cargado en la console de la bomberos-> configuration del proyecto-> postría en la nube
  • Revisar el perfil de aprovisionamiento en el centro de desarrollo de Apple (tuve que reactivar el perfil de aprovisionamiento de desarrollador ios).

Es posible que aún reciba la advertencia, pero si intenta enviar notifications desde la console de firebase utilizando el token de actualización, funcionará.

Parece que el server que está utilizando para enviar la notificación remota puede tener un logging antiguo de su token de FCM. Los documentos de FCM de Google indican que el token de FCM se puede rotar (cambiar) cuando:

  • La aplicación se restaura en un dispositivo nuevo
  • El usuario desinstala / reinstala la aplicación
  • El usuario borra los datos de la aplicación.

Citan que es una buena práctica actualizar el logging de su server de este token mediante un método de callback de delegado:

 func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) { // Send the token to your server here } 

Ese método no funcionaba para mí, así que tuve que actualizarlo manualmente en cada lanzamiento de la aplicación (después de un retraso de aproximadamente 20-25 segundos ya que la rotation no siempre es instantánea). Usted puede hacer esto con:

 let token = Messaging.messaging().fcmToken // Send this to your server 

Después de estos cambios, sigo recibiendo el post de logging de la console de advertencia, pero las notifications push funcionan perfectamente cada vez.