Firebase (FCM), как получить токен
Я первый использую FCM.
Я загружаю образец из firebase/quickstart-android, и я устанавливаю QuickMart FCM. Но я не могу получить какой-либо токен из журнала, даже попав в LOG Кнопка TOKEN в приложении.
Затем я пытаюсь отправить сообщение с консолью Firebase и установить для целевого объекта имя моего приложения. Я получил любое входящее сообщение.
Я хочу знать, можно ли использовать FCM? GCM все в порядке.
Решение:
Потому что я не разработчик Android, просто разработчик backend. Так что мне нужно некоторое время, чтобы его решить. По-моему, в примере есть некоторая ошибка.
![введите описание изображения здесь]()
код:
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 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 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.
}
}
Добавьте это в MainActivity.java.
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
После выполнения выше вы можете получить токен в logcat. Но, наконец, я нахожу удобный способ, чтобы его получить. Просто используйте режим отладки, чтобы установить пример приложения и вы можете получить токен, когда вы впервые установите его.
Но я не t why it can
t печатаю журнал, когда я его устанавливаю. Возможно, это связано с мобильной системой.
А потом почему я не могу получить уведомление. FirebaseMessagingService.onMessageReceived не вызывал sendNotification
Ответы
Ответ 1
Самый быстрый и хороший для прототипа
Быстрое решение состоит в том, чтобы сохранить его в sharedPrefs и добавить эту логику в метод onCreate
в вашей MainActivity или классе, который расширяет Application.
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(this, instanceIdResult -> {
String newToken = instanceIdResult.getToken();
Log.e("newToken", newToken);
getActivity().getPreferences(Context.MODE_PRIVATE).edit().putString("fb", newToken).apply();
});
Log.d("newToken", getActivity().getPreferences(Context.MODE_PRIVATE).getString("fb", "empty :("));
ЧИСТЫЙ ПУТЬ
Лучший вариант - создать сервис и придерживаться аналогичной логики. Сначала создайте новый Сервис
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onNewToken(String s) {
super.onNewToken(s);
Log.e("newToken", s);
getSharedPreferences("_", MODE_PRIVATE).edit().putString("fb", s).apply();
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
}
public static String getToken(Context context) {
return context.getSharedPreferences("_", MODE_PRIVATE).getString("fb", "empty");
}
}
А затем добавить его в файл AndroidManifest
<service
android:name=".MyFirebaseMessagingService"
android:stopWithTask="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
Наконец, вы можете использовать статический метод из вашей службы MyFirebaseMessagingService.getToken(Context);
Самый быстрый, но устарел
Log.d("Firebase", "token "+ FirebaseInstanceId.getInstance().getToken());
Он все еще работает, когда вы используете более старую библиотеку Firebase, чем версия 17.xx
Ответ 2
Важная информация.
если служба Google Play зависла или не работает, то fcm return token = null
Если сервис play работает нормально, метод FirebaseInstanceId.getInstance().getToken()
возвращает token
Log.d("FCMToken", "token "+ FirebaseInstanceId.getInstance().getToken());
Ответ 3
Согласно документу
Перенос клиентского приложения GCM в FCM
onTokenRefresh()
Вызывается только, если токен идентификатора экземпляра обновлен
Таким образом, он будет вызываться только в первый раз, когда вы устанавливаете приложение на свое устройство.
Поэтому я предлагаю удалить свое приложение вручную и попробовать снова запустить
определенно вы получите TOKEN
Ответ 4
Команда Firebase Android SDK немного изменила API. Я реализовал логику "Token to Server" следующим образом:
В моем случае FirebaseMessagingService:
public class FirebaseCloudMessagingService extends FirebaseMessagingService {
...
@Override
public void onNewToken(String token) {
// sending token to server here
}
...
}
Имейте в виду, что токен для каждого устройства, и он может обновляться Firebase независимо от вашей логики входа в систему. Итак, если у вас есть функциональные возможности входа и выхода, вам нужно рассмотреть дополнительные случаи:
- Когда новый пользователь входит в систему, вам необходимо привязать токен к новому пользователю (отправить его на сервер). Потому что токен может быть обновлен во время сеанса старого пользователя, а сервер не знает токен нового пользователя.
- Когда пользователь выходит из системы, вам необходимо отсоединить токен. Потому что пользователь больше не должен получать уведомления/сообщения.
Используя новый API, вы можете получить токен следующим образом:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String token = instanceIdResult.getToken();
// send it to server
}
});
Удачи!
Ответ 5
Попробуйте это. Почему вы используете RegistrationIntentService
?
public class FirebaseInstanceIDService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
String token = FirebaseInstanceId.getInstance().getToken();
registerToken(token);
}
private void registerToken(String token) {
}
}
Ответ 6
Эта строка должна получить токен FCM для Firebase.
String token = FirebaseInstanceId.getInstance().getToken();
Log.d("MYTAG", "This is your Firebase token" + token);
Сделайте Log.d, чтобы распечатать его на монитор Android.
Ответ 7
Вместо этого:
// [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 servers.
// sendRegistrationToServer(refreshedToken);
//
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
}
// [END refresh_token]
Сделайте это:
// [START refresh_token]
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
// Log.d(TAG, "Refreshed token: " + refreshedToken);
// Implement this method to send token to your app server
sendRegistrationToServer(refreshedToken);
}
// [END refresh_token]
И еще одно:
Вам нужно вызвать метод sendRegistrationToServer()
который будет обновлять токен на сервере, если вы отправляете push уведомления с сервера.
UPDATE:
Создается новый токен Firebase (вызывается onTokenRefresh()
), когда:
- Приложение удаляет идентификатор экземпляра
- Приложение восстанавливается на новом устройстве
- Пользователь удаляет/переустанавливает приложение
- Пользователь удаляет данные приложения.
Ответ 8
В то же время не забудьте включить это в файл манифеста, чтобы получить идентификатор токена
<service
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
Ответ 9
В Firebase firebase-messaging:17.1.0
и новее FirebaseInstanceIdService устарела, вы можете получить onNewToken
для класса FirebaseMessagingService
как описано на fooobar.com/questions/189238/...
Но если вы хотите просто получить токен в любое время, то теперь вы можете сделать это так:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( this.getActivity(), new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String newToken = instanceIdResult.getToken();
Log.e("newToken",newToken);
}
});
Ответ 10
Если вы используете некоторую функцию аутентификации firebase, вы можете взять токен, используя это:
//------GET USER TOKEN-------
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getToken(true)
.addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
String idToken = task.getResult().getToken();
// ...
}
}
});
Работать хорошо, если пользователь вошел в систему. getCurrentUser()
Ответ 11
для тех, кто приземляется здесь, до сих пор FirebaseInstanceIdService
устарел, используйте вместо этого:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onNewToken(String token) {
Log.d("MY_TOKEN", "Refreshed token: " + token);
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
// sendRegistrationToServer(token);
}
}
и объявить в AndroidManifest
<application... >
<service android:name=".fcm.MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
Ответ 12
попробуй это
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(OnSuccessListener<InstanceIdResult> { instanceIdResult ->
fcm_token = instanceIdResult.token}
Ответ 13
Вы можете использовать следующее в Firebase (FCM) для получения токена:
FirebaseInstanceId.getInstance().getToken();
Ответ 14
Метод getToken()
устарел. Вместо этого вы можете использовать getInstanceId()
.
Если вы хотите обрабатывать результаты при запросе instanceId(token)
, проверьте этот код.
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(instanceIdResult -> {
if (instanceIdResult != null) {
String token = instanceIdResult.getToken();
if (!TextUtils.isEmpty(token)) {
Log.d(TAG, "retrieve token successful : " + token);
}
} else{
Log.w(TAG, "instanceIdResult should not be null..");
}
}).addOnFailureListener(e -> {
//do something with e
}).addOnCanceledListener(() -> {
//request has canceled
}).addOnCompleteListener(task -> Log.v(TAG, "task result : " + task.getResult().getToken()));
Ответ 15
FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task) {
if (!task.isSuccessful()) {
Log.w(TAG, "getInstanceId failed", task.getException());
return;
}
// Get new Instance ID token
String **token** = task.getResult().getToken();
}
});
Ответ 16
Settings.Secure.getString(getContentResolver(),
Settings.Secure.ANDROID_ID);