如何在Android中保存FCM令牌?

时间:2018-08-14 06:21:49

标签: java android firebase firebase-cloud-messaging

我正在跟踪this在Firebase中注册我的设备

我在这里尝试显示并保存通知令牌

    public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseIIDService";

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

    private void storeToken(String token) {
        //saving the token on shared preferences
        SharedPrefManager.getInstance(getApplicationContext()).saveDeviceToken(token);
    }
}

当我尝试注册时,总是说令牌Token not generated表格 MainActivity

因此,这里我的应用程序已连接到Firebase。。我知道FirebaseInstanceIdService已弃用,我也尝试过使用此方法

public class MyFirebaseInstanceIDService extends FirebaseMessagingService {

    private static final String TAG = "MyFirebaseIIDService";

    @Override
    public void onNewToken(String refreshedToken) {
        refreshedToken = FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);
        storeToken(refreshedToken);
    }

    private void storeToken(String token) {
        //saving the token on shared preferences
        SharedPrefManager.getInstance(getApplicationContext()).saveDeviceToken(token);
    }
}

但是仍然不会生成相同的令牌

5 个答案:

答案 0 :(得分:8)

仅在生成新令牌时调用onTokenRefresh / onNewToken方法。

通常(尤其是在开发过程中),您的应用在添加服务之前已经已经生成了实例ID令牌。因此,不会调用onTokenRefresh / onNewToken,并且共享首选项中也不会包含令牌。

因此,您应该使用FirebaseInstanceId.getInstance().getInstanceId()直接从主要活动中获取令牌,如documentation所示。这将获取最后生成的令牌。从那里开始,您使用onTokenRefresh / onNewToken响应令牌更改

答案 1 :(得分:5)

只需将其添加到您的代码中即可。

    public class MyActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);


        SharedPreferences prefs = getSharedPreferences("TOKEN_PREF", MODE_PRIVATE);
        String token = prefs.getString("token", "");

        Log.e("NEW_INACTIVITY_TOKEN", token);

        if (TextUtils.isEmpty(token)) {
            FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(MyActivity.this, new OnSuccessListener<InstanceIdResult>() {
                @Override
                public void onSuccess(InstanceIdResult instanceIdResult) {
                    String newToken = instanceIdResult.getToken();
                    Log.e("newToken", newToken);
                    SharedPreferences.Editor editor = getSharedPreferences("TOKEN_PREF", MODE_PRIVATE).edit();
                    if (token!=null){
                       editor.putString("token", newToken);
                       editor.apply();
                    }

                }
            });
        }

    }


}

首次安装和运行该应用程序时,将调用Firebase令牌一次,因此 忽略一旦使用共享的Prefs保存数据后保存数据或运行此活动/服务 < / strong>

答案 2 :(得分:2)

生成令牌可能需要一些时间。如果没有得到,可以按以下方式生成它: (参考:https://firebase.google.com/docs/cloud-messaging/android/client?authuser=0

 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();
                            //Here you will surely get the token so store it in 
                            //sharedpreference for future use

                        }
 });

答案 3 :(得分:1)

尝试一下 只需卸载并重新安装应用 因为令牌不是在您每次玩应用程序时生成的。 它是在您清除sharePref或重新安装时生成的。

答案 4 :(得分:1)

不需要使用getToken() onNewToken参数返回的新令牌

@Override
public void onNewToken(String refreshedToken) {
    // No need to assign refreshedToken with getToken,
    // this method called when token refreshed then use returned refreshedToken directly,
    // use `instanceIdResult.getToken()` described below when you need to use token later throw app usage.

    // refreshedToken = FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);
    storeToken(refreshedToken);
}

getToken(); is also deprecated

  

在您的活动中获取令牌:.getToken();如果您也弃用了   需要在您的活动中获取令牌,然后使用以下方法:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MyActivity.this,  new OnSuccessListener<InstanceIdResult>() {
     @Override
     public void onSuccess(InstanceIdResult instanceIdResult) {
           String newToken = instanceIdResult.getToken();
           Log.e("newToken",newToken);

     }
 });