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 ?? "")")
La forma recomendada por Firebase:
let token = Messaging.messaging().fcmToken
Referencia: configuración de una aplicación de cliente de mensajería en la nube Firebase en iOS
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)"
}