如何处理FirebaseInstanceId.getToken()返回null

Aid*_*abe 5 android firebase

Firebase Messaging Android SDK(com.google.firebase:firebase-messaging:20.0.0)的最新更新@Nullable为该FirebaseIntanceId.getToken(String senderId, String scope)方法添加了返回类型注释。

由于我们使用该SDK在我们自己的代码中使用科特林,我们现在得到一个编译错误的推断返回类型不再String,但String?

问题是:getToken()呼叫返回时我们需要做什么null

文档没有提及null返回的情况或在这种情况下客户端代码需要执行的操作。

这种情况下的最佳做法是什么?重新请求getToken()向右走,与某种指数回退的重新请求呢?

Sil*_*los 0

Google 添加了回调方法,您可以在调用中添加 OnCompleteListener并异步检索它。

下面是一些 Java 代码示例:

private static String fcmId;

/**
 * Get the FCMID using a callback method
 */
public static void getFCMID(){
    try {
        FirebaseApp.getInstance();
        FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(
                task -> {
                    if (!task.isSuccessful()) {
                        try {
                            task.getException().printStackTrace();
                        } catch (Exception e){}
                        fcmId = null;
                        Log.d("FMCID", "Could not retrieve FCMID");
                        return;
                    }
                    InstanceIdResult result = task.getResult();
                    if(result == null){
                        fcmId = null;
                        Log.d("FMCID", "Could not retrieve FCMID");
                        return;
                    }
                    // Get new Instance ID token
                    String token = result.getToken();
                    if(!token.isEmpty()){
                        fcmId = token;
                        Log.d("FMCID", "Success! Do stuff with FCMID");
                    } else {
                        fcmId = null;
                        Log.d("FMCID", "Could not retrieve FCMID");
                    }
                });
    } catch (Exception e){
        fcmId = null;
        Log.d("FMCID", "Could not retrieve FCMID");
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是 Kotlin 中的:

private var fcmId: String? = null

/**
 * Get the FCMID using a callback method
 */
fun getFCMID() {
    try {
        FirebaseApp.getInstance()
        FirebaseInstanceId.getInstance().instanceId.addOnCompleteListener { task ->
            if(task.isSuccessful){
                val result = task.result
                if (result != null) {
                    // Get new Instance ID token
                    val token = result!!.token
                    if (!token.isEmpty()) {
                        fcmId = token
                        Log.d("FMCID", "Success! Do stuff with FCMID")
                    } else {
                        fcmId = null
                        Log.d("FMCID", "Could not retrieve FCMID")
                    }
                } else {
                    fcmId = null
                    Log.d("FMCID", "Could not retrieve FCMID")
                }
            } else {
                fcmId = null
                Log.d("FMCID", "Could not retrieve FCMID")
            }            
        }
    } catch (e: Exception) {
        fcmId = null
        Log.d("FMCID", "Could not retrieve FCMID")
        e.printStackTrace()
    }
}
Run Code Online (Sandbox Code Playgroud)

我通常的方法是运行它,分配令牌,然后将其保存到共享首选项或将其保存在单例中,即保存在扩展的类中Application