捕获设备注册令牌以通过Firebase云消息发送通知的正确方法是什么?

时间:2018-05-17 14:01:10

标签: android firebase firebase-realtime-database firebase-cloud-messaging

在我的玩具聊天应用程序中,我想设置一种方法,以便在其他用户使用Firebase Google Cloud Messaging发送邮件时向用户发送通知。在我的方法中,我打算捕获设备的注册令牌,然后使用Google的云功能向这些设备发送通知。此外,我的应用程序要求用户进行身份验证。

要在我的Firebase实时数据库中捕获令牌,我已按以下方式对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 :(得分:2)

FCM令牌与已安装的应用程序绑定(这就是他们称为“实例ID令牌”的原因),而不一定是特定的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保留了一个令牌。请注意,此处的正确数据结构取决于您的实际用例,因为同一用户可能会在多个设备上使用您的应用,因此会有多个令牌。