В новой Firebase, в разделе "Уведомление", они упомянули, что разработчик может отправлять уведомления на конкретное устройство. Для этого в консоли он запрашивает токен FCM. Что это точно и как я могу получить этот токен?
Что такое токен FCM в Firebase?
Ответ 1
Что именно?
Токен FCM, или широко известный как registrationToken
токен, как в google-cloud-messaging. Как описано в документах GCM FCM:
Идентификатор, выданный серверами соединения GCM клиентскому приложению, который позволяет ему получать сообщения. Обратите внимание, что регистрационные токены должны храниться в секрете.
Как я могу получить этот токен?
Обновление: токен все еще может быть getToken()
путем вызова getToken()
, однако, согласно последней версии FCM, FirebaseInstanceIdService.onTokenRefresh()
был заменен на FirebaseMessagingService.onNewToken()
- который в моем опыте функционирует так же, как onTokenRefresh()
сделал.
Старый ответ:
Согласно документам FCM:
При первом запуске приложения FCM SDK создает маркер регистрации для экземпляра клиентского приложения. Если вы хотите настроить таргетинг на отдельные устройства или создать группы устройств, вам потребуется доступ к этому токену.
Вы можете получить доступ к значению токена, расширив FirebaseInstanceIdService. Убедитесь, что вы добавили сервис в свой манифест, затем вызовите getToken в контексте onTokenRefresh и запишите значение, как показано:
@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); }
OnTokenRefreshcallback срабатывает всякий раз, когда генерируется новый токен, поэтому вызов getToken в его контексте гарантирует вам доступ к текущему доступному регистрационному токену. FirebaseInstanceID.getToken() возвращает ноль, если токен еще не сгенерирован.
После того, как вы получили токен, вы можете отправить его на сервер приложений и сохранить его, используя ваш предпочтительный метод. См. Ссылку API идентификатора экземпляра для получения полной информации об API.
Ответ 2
Вот простые шаги добавьте этот gradle:
dependencies {
compile "com.google.firebase:firebase-messaging:9.0.0"
}
Никаких дополнительных разрешений не требуется в манифесте, таком как GCM.
Никакой приемник не нужен, чтобы проявить себя как GCM. С помощью FCM автоматически добавляется com.google.android.gms.gcm.GcmReceiver
.
Перенос службы прослушивателя
Расширение службы InstanceIDListenerService
теперь требуется, только если вы хотите получить доступ к токену FCM.
Это необходимо, если вы хотите
- Управление токенами устройства для отправки сообщений на одно устройство напрямую или Отправка сообщений группе устройств или
- Отправка сообщений группе устройств или
- Подписывать устройства на темы с помощью API управления подписками на сервер.
Добавить службу в манифест
<service
android:name=".MyInstanceIDListenerService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
Измените MyInstanceIDListenerService
на расширение FirebaseInstanceIdService
и обновите код, чтобы прослушать обновления токена и получить токен всякий раз, когда генерируется новый токен.
public class MyInstanceIDListenerService extends FirebaseInstanceIdService {
...
/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is also called
* when the InstanceID token is initially generated, so this is where
* you 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);
}
}
Для получения дополнительной информации посетите
Ответ 3
FirebaseInstanceIdService теперь устарел. вы должны получить токен в методе onNewToken в службе FirebaseMessagingService.
Ответ 4
У меня есть обновление о токене Firebase Cloud Messaging, в котором я могу получить информацию.
Я действительно хотел узнать об этом изменении, поэтому просто отправил письмо в службу поддержки. Токен Firebase Cloud Messaging снова вернется к серверному ключу. Ничего не изменится. Мы снова увидим ключ сервера.
Ответ 5
Они отказались от метода getToken() в следующих примечаниях к выпуску. Вместо этого мы должны использовать getInstanceId.
https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId
Task<InstanceIdResult> task = FirebaseInstanceId.getInstance().getInstanceId();
task.addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult authResult) {
// Task completed successfully
// ...
String fcmToken = authResult.getToken();
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
// ...
}
});
Чтобы справиться с успехом и неудачей в том же слушателе, присоедините OnCompleteListener:
task.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task) {
if (task.isSuccessful()) {
// Task completed successfully
InstanceIdResult authResult = task.getResult();
String fcmToken = authResult.getToken();
} else {
// Task failed with an exception
Exception exception = task.getException();
}
}
});
Кроме того, класс FirebaseInstanceIdService устарел, и они придумали метод onNewToken в FireBaseMessagingService в качестве замены для onTokenRefresh,
здесь вы можете ознакомиться с примечаниями к выпуску, https://firebase.google.com/support/release-notes/android
@Override
public void onNewToken(String s) {
super.onNewToken(s);
Use this code logic to send the info to your server.
//sendRegistrationToServer(s);
}