Android:首次运行时Firebase令牌为空

Mat*_*šút 28 android firebase firebase-cloud-messaging

我正在使用FCM在我的应用中提供通知.一切都运作良好,但现在我意识到,当我使用Android Studio(而非GooglePlay)安装我的应用程序时,令牌在首次运行时为空.当我关闭我的应用程序并重新启动它时,令牌不再为空.导致这个问题的原因是什么,我该如何避免呢?

InstanceIDService:

public class InstanceIDService extends FirebaseInstanceIdService {

    @Override
    public void onTokenRefresh() {

        String token = FirebaseInstanceId.getInstance().getToken();
        registerToken(token);
    }

    private void registerToken(String token) {

        OkHttpClient client = new OkHttpClient();
        RequestBody body = new FormBody.Builder()
                .add("Token",token)
                .build();

        Request request = new Request.Builder()
                .url("url_to_registration_script")
                .post(body)
                .build();

        try {
            client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在MainActivity中:

FirebaseMessaging.getInstance().subscribeToTopic("topic");
String token = FirebaseInstanceId.getInstance().getToken();
Log.d("TOKEN", token);
Run Code Online (Sandbox Code Playgroud)

安装并首次启动应用程序时,上次日志返回null

注册脚本:

 <?php 
 if (isset($_POST["Token"])) {

       $_uv_Token=$_POST["Token"];
       $conn = mysqli_connect("localhost","user","pass","db") or die("Error connecting");
       $q="INSERT INTO users (Token) VALUES ( '$_uv_Token') "
          ." ON DUPLICATE KEY UPDATE Token = '$_uv_Token';";

  mysqli_query($conn,$q) or die(mysqli_error($conn));
  mysqli_close($conn);
}
?>
Run Code Online (Sandbox Code Playgroud)

小智 30

在第一个应用程序启动时异步提取令牌.在访问令牌之前,您必须等待onTokenRefresh()在您的呼叫中进行呼叫FirebaseInstanceIdService.


小智 8

从模拟器卸载应用程序并再次运行,以便再次调用onTokenRefreshed方法.

要查看是否已经注册,您只想知道FCM TOken

String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Run Code Online (Sandbox Code Playgroud)

在MyFirebaseMessagingService类中添加上面的任何位置(在oncreate方法中),只需添加Toast或记录refreshedToken.


小智 5

只需更换:

String token = instanceID.getToken();
Run Code Online (Sandbox Code Playgroud)

有:

String token = instanceID.getToken($SENDER_ID, "FCM");
Run Code Online (Sandbox Code Playgroud)

它会起作用.