Estoy migrando mi aplicación de GCM a FCM.
Cuando un nuevo usuario instala mi aplicación, onTokenRefresh()
se llama automáticamente. El problema es que el usuario aún no ha iniciado sesión (sin identificación de usuario).
¿Cómo puedo activar el onTokenRefresh()
después de que el usuario haya iniciado sesión?
android
firebase-cloud-messaging
TareK Khoury
fuente
fuente
Respuestas:
El
onTokenRefresh()
método se llamará cada vez que se genere un nuevo token. Tras la instalación de la aplicación, se generará inmediatamente (como ha comprobado que es el caso). También se llamará cuando el token haya cambiado.Según la
FirebaseCloudMessaging
guía:Esto significa que el registro del token es por aplicación. Parece que le gustaría utilizar el token después de que un usuario haya iniciado sesión. Lo que sugeriría es que guarde el token en el
onTokenRefresh()
método en el almacenamiento interno o en las preferencias compartidas. Luego, recupere el token del almacenamiento después de que un usuario inicie sesión y registre el token en su servidor según sea necesario.Si desea forzar manualmente
onTokenRefresh()
, puede crear un IntentService y eliminar la instancia del token. Luego, cuando llame a getToken,onTokenRefresh()
se volverá a llamar al método.Código de ejemplo:
EDITAR
onTokenRefresh () está en desuso . Usar
onNewToken()
enMyFirebaseMessagingService
fuente
Intente implementar
FirebaseInstanceIdService
para obtener el token de actualización.Acceda al token de registro:
Puede acceder al valor del token extendiendo FirebaseInstanceIdService . Asegúrese de haber agregado el servicio a su manifiesto , luego llame
getToken
en el contexto deonTokenRefresh
y registre el valor como se muestra:Código completo:
Vea mi respuesta aquí .
EDICIONES:
No debería iniciar un FirebaseInstanceIdService usted mismo.
Esto no se llamará con mucha frecuencia, es necesario para la rotación de claves y para manejar los cambios de ID de instancia debido a:
El sistema acelerará el evento de actualización en todos los dispositivos para evitar sobrecargar los servidores de aplicaciones con actualizaciones de tokens.
Pruebe a continuación :
fuente
onTokenRefresh()
?Mantengo una bandera en la preferencia compartida que indica si el token gcm se envió al servidor o no. En la pantalla de bienvenida cada vez que llamo a un método sendDevicetokenToServer. Este método verifica si la identificación del usuario no está vacía y si gcm envía el estado y luego envía el token al servidor.
}
En la clase MyFirebaseInstanceIDService
fuente
Chicos, tiene una solución muy simple.
https://developers.google.com/instance-id/guides/android-implementation#generate_a_token
Nota: Si su aplicación usó tokens que fueron eliminados por deleteInstanceID, su aplicación deberá generar tokens de reemplazo.
En lugar de eliminar el ID de la instancia, elimine solo el token:
fuente
Esto está en RxJava2 en el escenario cuando un usuario cierra la sesión de su aplicación y otros usuarios inician sesión (misma aplicación) Para volver a generar y llamar al inicio de sesión (si el dispositivo del usuario no tenía conexión a Internet antes en el momento de inicio de la actividad y necesitamos enviar el token api de inicio de sesión)
Iniciar sesión
fuente
Esta respuesta no destruye la identificación de la instancia, sino que puede obtener la actual. También almacena uno actualizado en las preferencias compartidas.
Strings.xml
Utility.java (cualquier clase en la que desee establecer / obtener preferencias)
MyFirebaseInstanceIdService.java (extiende FirebaseInstanceIdService)
}
El servicio de Android 2.0 y superior
onCreate
no se invoca cuando se inicia automáticamente ( fuente ). EnonStartCommand
su lugar, se anula y se utiliza. Pero en FirebaseInstanceIdService real, se declara como final y no se puede anular. Sin embargo, cuando iniciamos el servicio usando startService (), si el servicio ya se está ejecutando, se usa su instancia original (lo cual es bueno). ¡Nuestro onCreate () (definido arriba) también fue invocado !.Use esto al comienzo de MainActivity o en cualquier punto en el que crea que necesita la identificación de la instancia.
Y finalmente,
Tenga en cuenta que puede mejorar aún más esto intentando mover el código startservice () al método getFirebaseInstanceId.
fuente
fuente
La nueva forma de hacer esto sería anular el
onNewToken
método deFirebaseMessagingService
Además, no olvide agregar el servicio en Manifest.xml
fuente
Cómo actualizo mi deviceToken
Primero, cuando inicio sesión, envío el primer token de dispositivo bajo la colección de usuarios y el usuario que ha iniciado sesión actualmente.
Después de eso, simplemente anulo
onNewToken(token:String)
en myFirebaseMessagingService()
actualizo ese valor si se genera un nuevo token para ese usuarioCada vez que se abre su aplicación, se buscará un nuevo token, si el usuario aún no ha iniciado sesión, no actualizará el token, si el usuario ya ha iniciado sesión, puede comprobar si hay un
newToken
fuente