É a primeira vez que uso o FCM.
Baixei uma amostra de firebase / quickstart-android e instalo o FCM Quickstart. Mas não consigo obter nenhum token do registro, mesmo clicando no botão LOG TOKEN no aplicativo.
Em seguida, tento enviar uma mensagem com o console do Firebase e definir como destino o nome do pacote do meu aplicativo. Recebi mensagens.
Eu quero saber se o FCM pode ser usado? GCM está tudo bem.
Solução:
Porque eu não sou um desenvolvedor Android, apenas um desenvolvedor back-end. Então, demoro um pouco para resolver. Na minha opinião, existem alguns bugs no aplicativo de amostra.
Código:
RegistrationIntentService.java
public class RegistrationIntentService extends IntentService {
private static final String TAG = "RegIntentService";
public RegistrationIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
String token = FirebaseInstanceId.getInstance().getToken();
Log.i(TAG, "FCM Registration Token: " + token);
}
}
MyFirebaseInstanceIDService.java
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the InstanceID token
* is initially generated so this is where you would retrieve the token.
*/
// [START refresh_token]
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
// String refreshedToken = FirebaseInstanceId.getInstance().getToken();
// Log.d(TAG, "Refreshed token: " + refreshedToken);
//
// // TODO: Implement this method to send any registration to your app's servers.
// sendRegistrationToServer(refreshedToken);
//
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
}
// [END refresh_token]
/**
* Persist token to third-party servers.
* <p>
* Modify this method to associate the user's FCM InstanceID token with any server-side account
* maintained by your application.
*
* @param token The new token.
*/
private void sendRegistrationToServer(String token) {
// Add custom implementation, as needed.
}
}
Adicione isso no MainActivity.java.
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
Após fazer acima, você obtém o Token no Logcat. Mas, finalmente, encontro uma maneira conveniente de conseguir. Basta usar o modo de depuração para instalar o aplicativo de amostra e você pode obter o token quando instalá-lo pela primeira vez.
Mas não sei por que não consegue imprimir o log quando o instalo. Talvez esteja relacionado ao sistema móvel.
E então por que não consigo obter a notificação. FirebaseMessagingService.onMessageReceived não chamou sendNotification
String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken);
Respostas:
MAIS RÁPIDO E BOM PARA PROTÓTIPO
A solução rápida é armazená-lo em sharedPrefs e adicionar essa lógica ao
onCreate
método em sua MainActivity ou classe que está estendendo Application.MANEIRA MAIS LIMPA
A melhor opção é criar um serviço e manter dentro de uma lógica semelhante. Em primeiro lugar, crie um novo serviço
Em seguida, adicione-o ao arquivo AndroidManifest
Por fim, você pode usar um método estático de seu serviço
MyFirebaseMessagingService.getToken(Context);
O MAIS RÁPIDO MAS REMOVIDO
Ele ainda funciona quando você usa uma biblioteca do Firebase mais antiga que a versão 17.xx
fonte
FirebaseInstanceId.getInstance().getInstanceId()
vez deFirebaseInstanceId.getInstance().getToken()
, veja esta respostaInformação importante.
Se o serviço de reprodução estiver funcionando corretamente, o
FirebaseInstanceId.getInstance().getToken()
método retornatoken
fonte
A equipe por trás do Firebase Android SDK muda um pouco a API. Implementei a lógica "Token para servidor" assim:
Em minha instância de FirebaseMessagingService:
Lembre-se de que o token é por dispositivo e pode ser atualizado pelo Firebase, independentemente da sua lógica de login. Portanto, se você tiver a funcionalidade Login e Logout, deverá considerar casos extras:
Usando a nova API, você pode obter token como este:
Boa sorte!
fonte
De acordo com o doc
Migrar um aplicativo cliente GCM para o FCM
Portanto, ele chamará apenas na primeira vez quando você instalar um aplicativo em seu dispositivo.
Portanto, sugiro que desinstale seu aplicativo manualmente e tente executá-lo novamente
definitivamente você receberá TOKEN
fonte
String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken);
onTokenRefresh
não chamando cada login. como posso obter o token na minha tela de login?Experimente isso. Por que você está usando
RegistrationIntentService
?fonte
Essa linha deve fornecer a você o token Firebase FCM.
Faça Log.d para imprimi-lo no monitor do Android.
fonte
Em vez disso:
Faça isso:
E mais uma coisa:
ATUALIZAR:
Um novo token do Firebase é gerado (
onTokenRefresh()
é chamado) quando:fonte
FirebaseInstanceId.getInstance().deleteInstanceId()
em outro ThreadAo mesmo tempo, não se esqueça de incluir isso em seu arquivo de manifesto para receber a id do token
fonte
Em
firebase-messaging:17.1.0
e mais recentes o FirebaseInstanceIdService está obsoleto, você pode obter oonNewToken
naFirebaseMessagingService
classe conforme explicado em https://stackoverflow.com/a/51475096/1351469Mas se você quiser apenas obter o token a qualquer momento, agora você pode fazer assim:
fonte
O método
getToken()
está obsoleto. Você pode usar em seugetInstanceId()
lugar.Se você deseja manipular os resultados ao solicitar
instanceId(token)
, verifique este código.fonte
Se estiver usando alguma função de autenticação do firebase, você pode pegar o token usando este:
Funciona bem se o usuário estiver logado. getCurrentUser ()
fonte
tente isso
fonte
para aqueles que pousam aqui, até agora
FirebaseInstanceIdService
está obsoleto, use:e declarar no AndroidManifest
fonte
fonte
Você pode usar o seguinte no Firebase (FCM) para obter o token:
fonte
fonte