notification clave autenticación apns ios swift firebase firebase-cloud-messaging

clave - firebase cloud messaging ios



Manera correcta de recuperar el token para FCM-iOS 10 Swift 3 (12)

Tuve que implementar Firebase con FirebaseAuth / FCM, etc. y envié la notificación con éxito a través de la Consola Firebase.

Sin embargo, necesitaría enviar la notificación desde mi propio servidor de aplicaciones.

Me pregunto a continuación de qué manera es correcta la forma de recuperar el ID de registro para el dispositivo: -

1) recuperar el token de identificación de registro de didRegisterForRemoteNotificationWithDeviceToken

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { var token = "" for i in 0..<deviceToken.count { token += String(format: "%02.2hhx", arguments: [deviceToken[i]]) } print("Registration succeeded!") print("Token: ", token) Callquery(token) }

2) Recuperar el token de registro de firebase (basado en el documento de Firebase que recupera el token de registro actual)

let token = FIRInstanceID.instanceID().token()!

Estaba utilizando la primera forma, la notificación de inserción no se recibe, incluso el ID de registro se almacena en la base de datos de mi servidor de aplicaciones y obtengo este resultado de la sesión CURL:

{"multicast_id":6074293608087656831,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}

También probé la segunda forma y obtuve un error fatal al ejecutar la aplicación como se muestra a continuación:

Apreciado si alguien me puede señalar de la manera correcta, gracias!


Swift 4 + Firebase (5.3.0)

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { InstanceID.instanceID().instanceID(handler: { (result, error) in if let error = error { print("Error fetching remote instange ID: /(error)") } else if let result = result { print("Remote instance ID token: /(result.token)") } }) }


Swift 3 + Firebase 4.0.4:

static var FirebaseToken : String? { return InstanceID.instanceID().token() }


Estaba teniendo el mismo problema, pero no podía entender qué estaba pasando.

El didRegisterForRemoteNotificationsWithDeviceToken sugerido por @Sam se llama (casi) cada vez, por lo que es una buena solución. PERO, NO se llama la primera vez que abre la aplicación con el token actualizado.

Así que para este escenario aún necesitas:

func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) { print("Refreshed Token: /(fcmToken)") }

Así que si solo usas el:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { if let fcmToken = InstanceID.instanceID().token() { print("InstanceID token: /(fcmToken)") } }

Solo obtendrá el "token actualizado" la segunda vez que el usuario abra la aplicación.

Logré forzar un token de actualización al desinstalar la aplicación y limpiar la Carpeta de compilación (Producto> Carpeta de compilación limpia). Bueno para la prueba.

Idealmente, todo podría manejarse en el messaging:didReceiveRegistrationToken método delegado, pero no pude hacerlo funcionar. Otra forma de recibir notificaciones de cambios en el token FCM es escuchar la NSNotification llamada kFIRMessagingRegistrationTokenRefreshNotification como se sugiere en la documentación: https://firebase.google.com/docs/cloud-messaging/ios/client


La función tokenRefreshNotification no siempre se llama cuando se tokenRefreshNotification la aplicación.

Sin embargo, al colocar el código dentro de la función de delegado didRegisterForRemoteNotificationsWithDeviceToken regular, puedo obtener el token cada vez que:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { if let refreshedToken = InstanceID.instanceID().token() { print("InstanceID token: /(refreshedToken)") } }

(Swift 3 + Firebase 4.0.4)


Primer registro para la notificación de actualización del token de base de fuego:

NotificationCenter.default.addObserver(self, selector: #selector(tokenRefreshNotification), name: NSNotification.Name.InstanceIDTokenRefresh, object: nil)

Luego puede recibir el token en el selector tokenRefreshNotification:

func tokenRefreshNotification(_ notification: Notification) { if let refreshedToken = FIRInstanceID.instanceID().token() { print("InstanceID token: /(refreshedToken)") } // Connect to FCM since connection may have failed when attempted before having a token. connectToFcm() }


Primero importa las bibliotecas como:

import FirebaseInstanceID import FirebaseMessaging import UserNotifications

establecer delegado: MessagingDelegate, UNUserNotificationCenterDelegate

@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate, UNUserNotificationCenterDelegate {

Escriba este código en didFinishLaunching ():

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. FirebaseApp.configure() Messaging.messaging().delegate = self //remote Notifications if #available(iOS 10.0, *) { UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (isGranted, err) in if err != nil { //Something bad happend } else { UNUserNotificationCenter.current().delegate = self Messaging.messaging().delegate = self DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } } } else { // Fallback on earlier versions } if #available(iOS 10, *) { UNUserNotificationCenter.current().requestAuthorization(options: [.badge,.sound,.alert], completionHandler: { (granted, error) in application.registerForRemoteNotifications() }) }else{ let notificationSettings = UIUserNotificationSettings(types: [.badge,.sound,.alert], categories: nil) UIApplication.shared.registerUserNotificationSettings(notificationSettings) UIApplication.shared.registerForRemoteNotifications() } return true }

Escribe el método connectFCM de esta manera:

func ConnectToFCM() { Messaging.messaging().shouldEstablishDirectChannel = true if let token = InstanceID.instanceID().token() { print("/n/n/n/n/n/n/n/n/n/n ====== TOKEN DCS: " + token) }

También escriba métodos de delegado para registrarse y recibir notificaciones push:

func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) { print("/n/n/n/n/n ==== FCM Token: ",fcmToken) HelperFunction.helper.storeInUserDefaultForKey(name: kFCMToken, val: fcmToken) ConnectToFCM() } @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { // UIApplication.shared.applicationIconBadgeNumber += 1 NotificationCenter.default.post(name: NSNotification.Name(rawValue: "Barker"), object: nil) } func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { print(userInfo) } func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { print(userInfo) completionHandler(UIBackgroundFetchResult.newData) } }

Ahora podemos probarlo desde la consola firebase.

100% de trabajo, fácil y probado.

Nota: 1) Habilitar notificación de inserción desde la sección de capacidad de xcode.

2) Verifique dos veces sus dos certificados p12 cargados en la configuración del proyecto firebase.

3) El token del dispositivo solo puede obtenerse desde un dispositivo real, no desde un simulador.


Vaya con la segunda opción, y esto va a parecer realmente estúpido / simple, pero para corregir ese error fatal opcional, simplemente elimine la fuerza de desenvolvimiento al final

Tu codigo:
var token = FIRInstanceID.instanceID().token()!
Hazlo:
var token = FIRInstanceID.instanceID().token()

Eso al menos arreglará esa desagradable caída.


Dispositivo FCM Token swift3

let fcmDeviceToken = FIRInstanceID.instanceID().token() print("FCM token: /(fcmDeviceToken ?? "")")



Para obtener el token actual de FCM

if let token = Messaging.messaging().fcmToken { // token is current fcmToken }

Para renovar el token actual de FCM

Si eliminamos el ID de instancia actual, el token nuevo se recibirá vi MessagingDelegate (messaging: didReceiveRegistrationToken) un momento después.

InstanceID.instanceID().deleteID { (error) in if let er = error { print(er.localizedDescription) } else { print("instanceID().deleteID success ---------------➤") } }


Swift 4

Cortesía de: https://.com/a/50945350/1014164

InstanceID.instanceID().instanceID { (result, error) in if let error = error { print("Error fetching remote instange ID: /(error)") } else if let result = result { print("Remote instance ID token: /(result.token)") } }


func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken let deviceTokenString = deviceToken.reduce("") { $0 + String(format: "%02X", $1) } print("APNs device token: /(deviceTokenString)" }