Как правильно захватить токены регистрации устройства для отправки уведомлений через облачные сообщения Firebase? - PullRequest
0 голосов
/ 17 мая 2018

В своем игрушечном чат-приложении я хотел бы настроить способ отправки уведомлений пользователям, когда другие пользователи отправляют сообщения с помощью Firebase Google Cloud Messaging. В моем подходе я намереваюсь захватить маркеры регистрации устройств, а затем отправлять уведомления на эти устройства с помощью облачных функций Google. Кроме того, мое приложение требует, чтобы пользователи проходили аутентификацию.

Для захвата токенов в моей базе данных Firebase Realtime я подклассифицировал FirebaseInstanceIdService следующим образом:

public class MyFirebaseInstanceIdService extends FirebaseInstanceIdService {
    private static final String TAG = "MyFirebaseInstanceIdService";
    private static final String FCM_REG_TOKENS = "fcm_registration_tokens";

    @Override
    public void onTokenRefresh() {
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "This device updated token: " + refreshedToken);
        sendRegistrationTokenToServer(refreshedToken);
    }

    private void sendRegistrationTokenToServer(final String refreshedToken) {
        DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference();
        dbRef.child(FCM_REG_TOKENS).push().setValue(refreshedToken);
        Log.d(TAG, "sendRegistrationTokenToServer: NEW TOKEN: " + refreshedToken );
    }
}

Однако, похоже, что вышеуказанная служба запускается сразу после запуска приложения, даже до запуска SignInActivity. И на данный момент, очевидно, мне еще предстоит собрать сведения о пользователе Firebase для хранения токена в правильной базе данных.

У меня такое чувство, что я делаю это неправильно. Как правильно захватить токены регистрации устройств, чтобы отправлять уведомления на устройства с этими токенами?

1 Ответ

0 голосов
/ 17 мая 2018

Токены FCM привязаны к установленному приложению (именно поэтому они называются токенами идентификатора экземпляра), а не обязательно к конкретному пользователю проверки подлинности Firebase (поскольку приложение может даже не требовать от пользователя входа в систему).

Ваш код является правильным способом получения токена для экземпляра приложения.

Если у вас есть требование связать токен с пользователем, вам понадобится код для проверки обоих значений. Простой способ сделать это - получить текущего пользователя от Firebase Auth в вашем сервисе:

@Override
public void onTokenRefresh() {
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "This device updated token: " + refreshedToken);
    sendRegistrationTokenToServer(refreshedToken);
}

private void sendRegistrationTokenToServer(final String refreshedToken) {
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    if (user != null) {        
        DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference();
        dbRef.child(FCM_REG_TOKENS).child(user.getUid()).setValue(refreshedToken);
        Log.d(TAG, "sendRegistrationTokenToServer: NEW TOKEN: " + refreshedToken );
    }
}

Здесь хранится один токен для каждого уникального UID. Обратите внимание, что правильная структура данных здесь зависит от вашего фактического варианта использования, поскольку один и тот же пользователь может использовать ваше приложение на нескольких устройствах и, таким образом, иметь несколько токенов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...