0

我在我的应用程序中使用 GCM 并使用InstanceIdAPI 生成 GCM 令牌。我正面临InstanceIdAPI 返回的令牌无效的问题。

我使用 Postman 来检查令牌,并且不时地在某些设备中尝试使用令牌会引发 NotRegistered 错误。虽然,如果我随后强制执行该GCMInstanceIdListener服务,它会GCMRegistrationService再次调用,这一次我得到了正确的令牌。

有没有办法检查我收到的令牌是否在GCMRegistrationService工作中?我知道我们可以调用https://android.googleapis.com/gcm/send并验证令牌,但它需要在标头中传递服务器密钥,我不想将它存储在客户端上。

这就是我的代码的样子:

public class GCMInstanceIdListener extends InstanceIDListenerService {

    @Override
    public void onTokenRefresh() {
        Intent intent = new Intent(this, GCMRegistrationService.class);
        startService(intent);
    }
}


public class GCMRegistrationService extends IntentService {
    private static final String TAG = "GCMRegistrationService";

    public GCMRegistrationService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        InstanceID instanceID = InstanceID.getInstance(this);
        String token = instanceID.getToken(BuildConfig.GCM_SENDER_ID,
                GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
        Log.d(TAG, "GCM Token : " + token);
    }
}
4

1 回答 1

0

每次你的应用程序启动时运行你GCMRegistrationService的,并检查你在客户端本地保存的令牌是否与收到的令牌匹配。

@Override
protected void onHandleIntent(Intent intent) {
    String token = InstanceID.getInstance(this).getToken(BuildConfig.GCM_SENDER_ID,
            GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

    String savedToken = prefs.getString("token", "");

    if(!token.equals(savedToken)) {
        prefs.edit().putString("token", token).apply();
        sendTokenToBackend(token);    // If needed
    }
}

编辑:另外,请确保您拥有 GET_ACCOUNTS 权限。最近,我从我的应用程序中删除了此权限,并且我的设备上出现了 NotRegistered 错误。如果您的应用针对 API 23+,您需要在运行时请求此权限。

于 2016-04-02T15:47:30.750 回答