notification configurar clave autenticación apns ios swift firebase apple-push-notifications

ios - configurar - Aplicación de entrega de mensajes de nube terminan



firebase push notification ios (4)

Aquí está la solución,

Primero cargue los certificados necesarios en la Consola Firebase. Luego, en su aplicación, habilite Notificaciones Push y Modos de Fondo -> Notificaciones Remotas

Después de eso, en App Delegate use el código siguiente (especifico la línea delicada):

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { registerForPushNotifications(application) // Override point for customization after application launch. // Use Firebase library to configure APIs FIRApp.configure() return true } func registerForPushNotifications(application: UIApplication) { let notificationSettings = UIUserNotificationSettings( forTypes: [.Badge, .Sound, .Alert], categories: nil) application.registerUserNotificationSettings(notificationSettings) } func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { if notificationSettings.types != .None { application.registerForRemoteNotifications() } } func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { let tokenChars = UnsafePointer<CChar>(deviceToken.bytes) var tokenString = "" for i in 0..<deviceToken.length { tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]]) } //Tricky line FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Unknown) print("Device Token:", tokenString) }

Tengo una aplicación que almacena la sesión del usuario en NSUserDefaults. Cuando la aplicación se ve obligada a cerrar, en la verificación inicial si la sesión del usuario del controlador de datos allí, en caso de que se envíe a la ventana de inicio de la siguiente manera:

override func viewWillAppear(animated: Bool) { self.view.hidden = true let defaults = NSUserDefaults.standardUserDefaults() if defaults.stringForKey("user") != nil { dispatch_async(dispatch_get_main_queue(), { () -> Void in let viewController:UIViewController = self.storyboard?.instantiateViewControllerWithIdentifier("vistaInicio") as! ViewControllerInicio self.presentViewController(viewController, animated: true, completion: nil) }) }else { self.view.hidden = false } }

Esto funcionó sin problemas hasta el día de hoy, cuando decidí implementar notificaciones push con la actualización de firebase siguiendo este tutorial Configuración de una aplicación de cliente de mensajería en la nube de Firebase en iOS . El problema ocurre cuando él eliminó la aplicación y vuelve a ingresar, da el siguiente código de error:

2016-05-19 16:05:27.647: <FIRInstanceID/WARNING> Failed to fetch APNS token Error Domain=com.firebase.iid Code=1001 "(full)" 2016-05-19 16:05:27.659: <FIRMessaging/INFO> FIRMessaging library version 1.1.0 2016-05-19 16:05:27.831: <FIRMessaging/WARNING> FIRMessaging registration is not ready with auth credentials Unable to connect with FCM. Optional(Error Domain=com.google.fcm Code=501 "(null)")


Después de haber revisado por triplicado toda la integración, para mí el problema era que el dispositivo de prueba había cambiado la fecha a una semana antes. Probablemente el FCM SDK hace algunas verificaciones basadas en la fecha.

El error podría ser menos genérico en el lado de Firebase, ya que perdí casi un día buscando una solución. Espero que esto ayude.


La respuesta es correcta: esos son los pasos, pero también compruebe la hora de su dispositivo. Ya que si su fecha y hora están demasiado desactualizadas no funcionará


No lo olvides en AppDelegate:

import Firebase import FirebaseInstanceID import FirebaseMessaging func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { registerForPushNotifications(application) FIRApp.configure() // Add observer for InstanceID token refresh callback. NSNotificationCenter .defaultCenter() .addObserver(self, selector: #selector(AppDelegate.tokenRefreshNotificaiton), name: kFIRInstanceIDTokenRefreshNotification, object: nil) // Override point for customization after application launch. return true } func registerForPushNotifications(application: UIApplication) { let settings: UIUserNotificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) application.registerUserNotificationSettings(settings) application.registerForRemoteNotifications() } func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { print("===== didReceiveRemoteNotification ===== %@", userInfo) } func tokenRefreshNotificaiton(notification: NSNotification) { let refreshedToken = FIRInstanceID.instanceID().token()! print("InstanceID token: /(refreshedToken)") // Connect to FCM since connection may have failed when attempted before having a token. connectToFcm() } func connectToFcm() { FIRMessaging.messaging().connectWithCompletion { (error) in if (error != nil) { print("Unable to connect with FCM. /(error)") } else { print("Connected to FCM.") } } }

Por favor, asegúrese también de hacer en Info.plist : FirebaseAppDelegateProxyEnabled = NO

Por ahora no lo sé, pero recibí la print(...) en didReceiveRemoteNotification pero no didReceiveRemoteNotification la ventana emergente. Envío el mensaje desde Firebase -> Console -> Notification -> Single device y copio aquí el token que recibí de Xcode Console -> func tokenRefreshNotificaiton