【问题标题】:How to Save a FCM token in Android?如何在 Android 中保存 FCM 令牌?
【发布时间】:2019-01-20 22:10:14
【问题描述】:

我正在关注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 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);
    }
}

但仍然没有生成相同的令牌

【问题讨论】:

标签: java android firebase firebase-cloud-messaging


【解决方案1】:

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

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

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

【讨论】:

  • 是的,现在我知道只有在第一次安装应用程序时才会生成令牌...获取令牌后我正在尝试添加共享首选项,,但是卸载后它工作正常..跨度>
  • 所以不用卸载每次运行时都能拿到Token吗???如果已经生成令牌,我不会调用生成令牌的服务
  • 卸载确实会擦除令牌。因此,在重新安装时,您的 onTokenRefresh/onNewToken 会被调用。正如我在回答中所说,如果您只是想在主要活动中获取令牌,请致电 FirebaseInstanceId.getInstance().getInstanceId()。如果这不会产生令牌,则它尚未生成,您的 onTokenRefresh/onNewToken 最终将被调用。
  • 是的,谢谢你和@MLN 现在我明白了.. 谢谢
  • @FrankvanPuffelen 你能帮我解决同样的问题吗?即使在第一次运行时,我的令牌也没有生成。这是我的问题的链接。 stackoverflow.com/questions/52658578/…
【解决方案2】:

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

【讨论】:

  • 是的,现在这个工作正常生成令牌,,,但是没有卸载是不可能的???
【解决方案3】:

无需使用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);

     }
 });

【讨论】:

  • 您的答案不再是实际的(他们似乎每隔几个月就会更改一次 firebase lietarlly,即使您复制粘贴,他们的一半文档也不起作用,并且大量方法已被弃用或完全不同)。
【解决方案4】:

生成令牌可能需要一些时间。如果你没有得到它,你可以按如下方式生成它: (参考: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

                        }
 });

【讨论】:

    【解决方案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 令牌在应用首次安装和运行时被调用一次,因此忽略保存数据或在使用共享首选项保存数据后运行此活动/服务

    【讨论】:

    • 是的,现在可以正常工作了..每次打开应用程序时都没有影响..并且令牌已成功保存
    猜你喜欢
    • 2017-08-09
    • 2018-06-21
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2018-05-04
    • 1970-01-01
    相关资源
    最近更新 更多