【问题标题】:Android Firebase cloud messaging Control the services onTokenRefresh()Android Firebase 云消息 控制服务 onTokenRefresh()
【发布时间】:2016-08-16 10:45:03
【问题描述】:

我是 firebase 新手,我有一个登录屏幕。成功登录后,我想调用 getToken 方法以及令牌,我还将用户登录 ID 保存在集中式服务器中。因此登录后我调用这两行。

FirebaseMessaging.getInstance().subscribeToTopic("test");
FirebaseInstanceId.getInstance().getToken();

我的服务如下

public class FirebaseInstanceIDService extends FirebaseInstanceIdService {

    public static  String busid;


    @Override
    public void onTokenRefresh() {
        String token = FirebaseInstanceId.getInstance().getToken();
        registerToken(token);
    }

    private void registerToken(String token) {


     OkHttpClient client = new OkHttpClient();
     business_login_id=Lib.GetPref(FirebaseInstanceIDService.this, "KEY_USER_ID", "");


        RequestBody body = new FormBody.Builder()
                .add("token",token)
                .add("business_login_id", business_login_id)
                .build();

  Lib.Debug("Calling URL with body "+body.toString());

        Request request = new Request.Builder()
                .url("http://mywebsite.com/gcm/register.php")
                .post(body)
                .build();

        try {
            client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我的问题是:为什么服务 FirebaseInstanceIDService 正在执行而不管登录后屏幕并立即为应用程序创建令牌 ID(在我的情况下 business_login_id 为空)。

此时我的用户 ID 尚未登录。有什么方法可以使用正确的凭据来精确控制 POST 登录现在创建令牌吗?

【问题讨论】:

  • 想知道为什么我的问题被否决了。当您在数据库服务器中保留多个元素时,这是一个独特的问题。

标签: android firebase-cloud-messaging


【解决方案1】:

第一次安装您的应用时会自动启动FirebaseInstanceIdService。它不会等到用户登录,也不必等到:令牌可以在用户未登录的情况下获得

但通常情况下,在用户通过身份验证之前,您无法保存令牌(例如保存到托管数据库)。因此,您需要在应用程序中的某处保留令牌或稍后请求令牌。

抓住令牌

您可以将令牌存储在 Shared Preferences 中,直到您的应用准备好使用它:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("token", token);
editor.commit();

然后一旦用户登录:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
String token = sharedPref.getInt(token, null);
registerToken(token);

稍后请求令牌

Firebase 云消息传递会在应用安装后立即生成一个令牌。所以很有可能在您的用户登录时,令牌早就生成了。在这种情况下,您也可以在用户登录后简单地请求令牌。

如果您要使用 Firebase 身份验证,则类似于:

FirebaseAuth.getInstance().addAuthStateListener(new FirebaseAuth.AuthStateListener() {
    public void onAuthStateChanged(FirebaseAuth firebaseAuth) {
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null) {
            String token = FirebaseInstanceId.getInstance().getToken();
            registerToken(token);
        }
    }
};

【讨论】:

  • 完美...这正是我现在正在做的。只是想确认我的解决方法是正确的。非常感谢弗兰克。
【解决方案2】:

对于 Firebase,无需查看更多参考资料。 只需浏览此示例代码,它就可以 100% 工作。

https://github.com/firebase/quickstart-android

【讨论】:

    猜你喜欢
    • 2018-04-23
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多