ios - notification - La notificación de APNS Firebase no pudo obtener el token
firebaseappdelegateproxyenabled (6)
Para Swift3 / iOS10, consulte este enlace:
Notificaciones Push de ios10, Swift 3 y Firebase (FCM)
Intento usar Firebase para Notificaciones y lo integé exactamente como se describe en los documentos. Pero no entiendo por qué no funciona. Cuando construyo mi proyecto, veo esta línea:
2016-05-25 16:09:34.987: <FIRInstanceID/WARNING> Failed to fetch default token Error Domain=com.firebase.iid Code=0 "(null)"
Este es mi AppDelegate:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
FIRApp.configure()
FIRDatabase.database().persistenceEnabled = true
var service: DataService = DataService()
service.start()
registerForPushNotifications(application)
application.registerForRemoteNotifications()
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]])
}
FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Unknown)
print("Device Token:", tokenString)
}
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
// Print message ID.
print("Message ID: /(userInfo["gcm.message_id"]!)")
// Print full message.
print("%@", userInfo)
}
1 - ¿Ha configurado correctamente sus certificados como se especifica en la documentación de google (no recordaré el proceso aquí, es bastante largo ...)? ( https://firebase.google.com/docs/cloud-messaging/ios/certs#configure_an_app_id_for_push_notifications )
2 - He tenido dificultades al configurar FCM. Una vez que pensé que todo estaba bien pero las notificaciones aún no funcionaban, decidí eliminar por completo la aplicación del teléfono, limpiar mi carpeta de compilación y volver a instalar todo. Después de eso, estaba funcionando.
3 - La aplicación recibía notificaciones, pero todavía recibía el mensaje "No se pudo obtener el token predeterminado ...". Desapareció después de un tiempo. No me preguntes por qué!
Esta no es realmente una respuesta adecuada, solo comparto mi experiencia porque sé que configurar notificaciones no es fácil y todas las pistas son bienvenidas. Entonces tal vez este pueda ayudar. Saludos :)
1. Configurar Notification Observer en el método didFinishLaunchingWithOptions
2.Y configure el método tokenRefreshNotification luego obtienes Token en este método.
Ver abajo Código
import Firebase
import FirebaseMessaging
override func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
FIRApp.configure()
NotificationCenter.default.addObserver(self,
selector: #selector(self.tokenRefreshNotification(notification:)),
name: NSNotification.Name.firInstanceIDTokenRefresh,
object: nil)
}
// NOTE: Need to use this when swizzling is disabled
public func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Sandbox)
}
func tokenRefreshNotification(notification: NSNotification) {
// NOTE: It can be nil here
let refreshedToken = FIRInstanceID.instanceID().token()
print("InstanceID token: /(refreshedToken)")
connectToFcm()
}
func connectToFcm() {
FIRMessaging.messaging().connectWithCompletion { (error) in
if (error != nil) {
print("Unable to connect with FCM. /(error)")
} else {
print("Connected to FCM.")
}
}
}
public func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
print(userInfo)
}
Después de probar todo lo anterior (y cualquier cosa que pueda encontrar en otro lado), lo que resuelve el problema para mí es moverme
let token = FIRInstanceID.instanceID().token()
ser llamado al presionar un botón, y no al cargar la aplicación.
Sé que probablemente no sea la solución más elegante, pero es lo suficientemente buena para la depuración. Supongo que el token no está disponible inmediatamente por el servidor y tarda un tiempo en generarse.
FCM estaba trabajando para mí y luego se detuvo. Hice lo que Rabs G. sugirió y eliminé la aplicación e instalé nuevamente y las notificaciones comenzaron a funcionar nuevamente.
Las respuestas anteriores cubren la mayor parte del problema, pero tuve el mismo problema y la siguiente información me resultó útil:
Firebase puede ''rotar'' (cambiar) la ficha de FCM de un usuario en cualquier momento. Esta es la identificación de 128 caracteres que su servidor usará para enviar la notificación de inserción al dispositivo.
Los documentos de Firebase dicen que la mejor práctica es usar un delegado para supervisar los cambios con el método de devolución de llamada del delegado:
- (void)messaging:(nonnull FIRMessaging *)messaging didRefreshRegistrationToken:(nonnull NSString *)fcmToken
[Obj - C]
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String)
[Rápido]
El método delegado debe invocarse en cada cambio, momento en el que puede actualizar el registro en su servidor.
Desafortunadamente, eso no funcionaba para mí, tenía un delegado pero no se invocaba la devolución de llamada. Así que tuve que recurrir a actualizar manualmente el token en cada lanzamiento de la aplicación (como lo sugiere @micheal chein arriba) de la siguiente manera:
NSString *deviceToken = [FIRInstanceID instanceID].token; // Send this to your server
[Obj-C]
let token = FIRInstanceID.instanceID().token() // Send this to your server
[Rápido]
** Importante: actualice el token después de un retraso (20-25 s), ya que la rotación a veces solo puede reflejar después de un tiempo. Puedes usar un temporizador para esto.
Después de esto, sigo recibiendo el mensaje de advertencia / error APNS:
2017-06-06 09:21:49.520: <FIRInstanceID/WARNING> Failed to fetch APNS token Error Domain=com.firebase.iid Code=1001 "(null)"
PERO , las notificaciones push funcionan siempre sin falta. Así que creo que el mensaje de registro está un poco apagado (posiblemente a destiempo). Si puede obtener la opción 2 para que trabaje para usted, ¡definitivamente haga eso!
Yo también tuve el mismo problema y nada funcionó para mí. Pero todo lo que tienes que hacer es ir a la consola de tu Firebase y luego encontrar tu proyecto y ver su configuración, allí verifica en su pestaña de mensajería en la nube y sube tu certificado .p12 a eso.
¡Eso es! feliz codificación :)