Уникальный идентификатор устройства Android для использования с генератором токенов Google Firebase

Я создаю приложение, которое использует Google Firebase в качестве службы push-уведомлений. Я просто использую сервер push-уведомлений и НЕ ХОЧУ использовать другие его службы (такие как база данных, аутентификация и т. д.).

В моем приложении пользователь, который регистрируется, может иметь несколько устройств и, следовательно, несколько токенов firebase. Проблема возникает при вызове onRefreshToken. Я должен знать, какое устройство использует пользователь, и обновить токен этого конкретного устройства в моей базе данных. Поэтому я должен знать уникальный идентификатор для каждого устройства, который не меняется в течение всего срока службы устройства.

Мне было интересно, есть ли какие-нибудь лучшие способы решения этой проблемы, а если нет, то я так запутался в уникальном идентификаторе Android. Есть два варианта: Settings.Secure.ANDROID_ID, который может иметь некоторые проблемы (поэтому я не уверен, стоит ли его использовать) и TelephonyManger.getDeviceId(), который иногда возвращает значение null и для устройств, у которых нет слотов для сим-карт (например, планшетов).

Так что ты предлагаешь мне делать?


person roostaamir    schedule 09.07.2016    source источник
comment
Вы можете сохранить текущий токен идентификатора экземпляра в общих настройках приложения, а затем прочитать его оттуда в onTokenRefresh().   -  person Frank van Puffelen    schedule 09.07.2016


Ответы (3)


У этого ответа есть 2 решения:

1) Использование ANDROID_ID в качестве идентификатора устройства.

2) Использование облачных функций и FCM для определения плохого токена после отправки на него 1-го сообщения.

1) Попробуйте Settings.Secure.ANDROID_ID, чтобы получить идентификатор устройства.

String deviceAppUID = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
if (deviceAppUID!=null) {
    setFirebaseTokenInServer(deviceAppUID, FirebaseDeviceToken);}

Android меняет ANDROID_ID в версии 8.0 (API 26), чтобы он применялся только к комбинации определенного приложения, пользователя и идентификатора устройства. Когда это происходит, вы на самом деле не получаете идентификатор устройства, который ВСЕГДА верен для каждого приложения, а скорее вы получаете идентификатор устройства для вашего конкретного приложения с его конкретным ключом подписи на вашем конкретном устройстве. Вы можете удалить приложение и переустановить его, и ANDROID_ID будет таким же, как и раньше.

Это делает его более безопасным для пользователя, но по-прежнему позволяет вам сохранять токены устройств Firebase в случае изменения токена регистрации по следующим причинам:

  • Приложение удаляет идентификатор экземпляра
  • Приложение восстановлено на новом устройстве Пользователь
  • удаляет/переустанавливает приложение
  • Пользователь очищает данные приложения

Затем в Firebase вы можете сохранить их как:

DeviceTokens:
    deviceID:  firebaseDeviceToken
    deviceID:  firebaseDeviceToken

2) Использование Firebase Cloud Messaging и Firebase Google Cloud Functions для определения плохого токена.

Если вы также используете облачные функции для отправки FCM на каждый указанный токен устройства (что необходимо, если несколько устройств), вы можете проверить наличие ответа после отправки первого уведомления. Если есть ошибка, и ошибка возвращает сообщение о том, что токен неисправен, вы можете обработать ошибку, а затем удалить ее с сервера.

  • Идентификатор устройства не требуется, что намного безопаснее для пользователя.
  • Отправляет 1 FCM на плохой токен, но больше не после этого
  • Если команда Firebase изменит свои ошибки или сообщения об ошибках, вам придется изменить функцию, иначе она больше не будет работать.

Дополнительные сведения см. в этом ответе: Обработка токенов обновления для групп устройств FCM

person Jeff Padgett    schedule 22.06.2018

В классе вы расширяете «FirebaseInstanceIdService» в методе «onTokenRefresh», вы можете получить его следующим образом:

FirebaseInstanceId.getInstance().getId()
person ergunkocak    schedule 14.11.2016

Вы можете получить токен устройства, расширив свой пользовательский класс с помощью FirebaseInstanceIdService Class

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseInsIDService";

    @Override
    public void onTokenRefresh() {
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Device Token: " + refreshedToken);
    }
}

Добавьте service в свой файл AndroidManifest.xml

<service
        android:name=".MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
 </service>

Теперь вы можете использовать токен устройства для отправки уведомлений на мобильный телефон пользователя.

Я настоятельно рекомендую получить последний обновленный токен регистрации.

Токен регистрации может измениться, когда:

  • Приложение удаляет идентификатор экземпляра
  • Приложение восстановлено на новом устройстве
  • Пользователь удаляет/переустанавливает приложение. Пользователь очищает данные приложения.

Когда вам нужно получить текущий токен, вызовите FirebaseInstanceId.getInstance().getToken(). Этот метод возвращает null, если токен еще не был сгенерирован.

person Hassnain Jamil    schedule 09.04.2018