Android: el token de Firebase es nulo al principio
Estoy utilizando FCM para proporcionar notificaciones en mi aplicación. Todo funcionó bien, pero ahora me di cuenta de que, cuando instalo mi aplicación utilizando Android Studio (no de GooglePlay) el token es nulo al principio. Cuando cierre mi aplicación y la reinicie, el token ya no es nulo. ¿Qué causa este problema y cómo puedo evitarlo?
InstanceIDService:
- Cómo manejar FirebaseInstanceId.getInstance (). GetToken () = null
- Método de llamada en una actividad en ejecución de un servicio
- Fireman FCM token - ¿Cuándo enviar al servidor?
- Cómo manejar Token en Firebase Token Service en Android?
- Notificación de empuje FCM (Firebase Cloud Messaging) con Asp.Net
public class InstanceIDService extends FirebaseInstanceIdService { @Override public void onTokenRefresh() { String token = FirebaseInstanceId.getInstance().getToken(); registerToken(token); } private void registerToken(String token) { OkHttpClient client = new OkHttpClient(); RequestBody body = new FormBody.Builder() .add("Token",token) .build(); Request request = new Request.Builder() .url("url_to_registration_script") .post(body) .build(); try { client.newCall(request).execute(); } catch (IOException e) { e.printStackTrace(); } } }
En MainActivity:
FirebaseMessaging.getInstance().subscribeToTopic("topic"); String token = FirebaseInstanceId.getInstance().getToken(); Log.d("TOKEN", token);
El último registro devuelve null cuando la aplicación se instala y se inicia por primera vez
Script de registro:
<?php if (isset($_POST["Token"])) { $_uv_Token=$_POST["Token"]; $conn = mysqli_connect("localhost","user","pass","db") or die("Error connecting"); $q="INSERT INTO users (Token) VALUES ( '$_uv_Token') " ." ON DUPLICATE KEY UPDATE Token = '$_uv_Token';"; mysqli_query($conn,$q) or die(mysqli_error($conn)); mysqli_close($conn); } ?>
- No se pueden expandir notificaciones de Firebase
- ¿Cómo enviar una notificación push a más de 1000 usuarios que utilizan firebase en Android?
- Firebase Cloud Messaging (FCM): inicia la actividad cuando el usuario hace clic en la notificación con extras
- Manejando keepSynced () mientras está en segundo plano en Android y con FCM
- Cómo enviar el dispositivo a la notificación del dispositivo usando FCM sin usar XMPP o cualquier otro script.
- Las notificaciones de FCM Push no muestran la visualización de los cabezales en la notificación en la parte superior de la pantalla
- ¿Qué significa "servidor de aplicaciones en mi propio entorno" en la documentación de Firebase Cloud Messaging?
- Implementación de FCM (Firebase Cloud Messaging) en una aplicación MVC Web
El token se obtiene de forma asincrónica en el primer inicio de la aplicación. Tienes que esperar a que onTokenRefresh()
sea llamado en tu FirebaseInstanceIdService
antes de que se pueda acceder al token.
Desinstale la aplicación del emulador y ejecute de nuevo, para que el método onTokenRefreshed se llame de nuevo.
Para comprobar si ya está registrado y desea saber el FCM TOken
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Agregue la línea anterior en la clase MyFirebaseMessagingService en cualquier lugar (en el método oncreate) y solo Toast o registre el refreshedToken.
Incluso tuve el mismo problema. Yo había dado la sentencia de registro para imprimir token en onCreate de mi actividad de lanzador. Se tarda un tiempo en actualizar el token una vez que desinstala la aplicación. Es por eso que obtienes nulo. Tienes que esperar un poco para que el token se refresque.
Acabo de caer en el mismo problema y esta es la forma en que lo arregló. Llame al bloque en algún lugar del método onCreate()
de su actividad. Quiero enviar el token a mi servidor de análisis, por lo que debe cambiarlo en función de sus necesidades.
Esta es la muestra que seguí.
private void subscribeUserToParse() { String deviceToken = FirebaseInstanceId.getInstance().getToken(); if (TextUtils.isEmpty(deviceToken)) { Intent intent = new Intent(this, MyFirebaseInstanceIDService.class); startService(intent); return; } User user = UserUtil.retrieveUserFromDB(mRealm); String objectId = user.getParseObjectId(); if (!TextUtils.isEmpty(objectId)) { ParseUtils.subscribeWithUsersObjectId(objectId, deviceToken); } }
Yo estaba enfrentando el mismo problema. Miré a través de un montón de puestos SO y otros foros y encontré una solución que funcionó para mí. La documentación de FCM dice que se debe usar este método para obtener un token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
He encontrado un post en línea (me disculpo, no recuerdo cuál, lo encontré hace un tiempo) que utilizó este método en su lugar:
String refreshedToken = FirebaseInstanceId.getInstance().getToken() (String authorizedEntity, String scope);
La documentación de FCM describe el primer método como:
Devolver el token maestro para el proyecto Firebase predeterminado.
Mientras que el segundo se describe como:
Devuelve un token que autoriza a una Entidad a realizar una acción en nombre de la aplicación identificada por ID de Instancia. Esto es similar a un token OAuth2 excepto, se aplica a la instancia de la aplicación en lugar de a un usuario. Por ejemplo, para obtener un token que se puede utilizar para enviar mensajes a una aplicación a través de FirebaseMessaging, establezca el ID de remitente y establezca en "FCM".
He estado buscando por qué la primera llamada de método tarda más tiempo en devolver un token, pero aún no he encontrado una respuesta. Espero que esto ayude.
Sólo reemplazar:
String token = instanceID.getToken();
con:
String token = instanceID.getToken($SENDER_ID, "FCM");
Y funcionará.
Simplemente agregando esto funcionará.
if(regid == null) { regid = FirebaseInstanceId.getInstance().getToken(); }