几个小时后,Android SDK从GCM收到NotRegistered错误

Gil*_*Gil 12 sdk android google-cloud-messaging

问题

我正在编写和Android SDK,它应该从SDK服务器端接收GCM推送消息.成功推送消息发送几个小时后,GCM服务器返回NotRegistered错误:

{
    "multicast_id":6205350692941230304,
    "success":0,
    "failure":1,
    "canonical_ids":0,
    "results":
    [
        {
            "error":"NotRegistered"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

registrationId在客户端并没有改变,而在服务器端与该令牌更新.

我该如何解决这个registrationId问题?有两个听众 - 一个在SDK中,一个在应用程序中 - 一个问题?

建筑

我的Android SDK regId在初始化时注册GCM ,并将该id发送到支持SDK的服务器.

拥抱应用程序可能(通常会)注册regId自己的GCM .另一个regId可能被发送到拥抱应用程序的服务器.

senderIdSDK和应用程序的不同.

履行

表现

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> ...

    <receiver
        android:name="com.xxxx.xxxxx.xxxxx"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

注册码

protected String doInBackground(Void... params) {
    String msg = "";
    try {
        if (gcm == null) {
            gcm = GoogleCloudMessaging.getInstance(mContext);
        }
        regid = gcm.register(SENDER_ID);
        msg = "Device registered, registration ID=" + regid;
        storeRegistrationId(mContext, regid);
        listener.onGCMRegisterFinish(regid);
    } 
    catch (IOException ex) 
    {
        msg = "Error :" + ex.getMessage();
    }
    return msg;
}
Run Code Online (Sandbox Code Playgroud)

此代码regId从GCM服务器获取并将其发送到我们的后端服务器.它在SDK初始化时执行,regId每次应用程序从后台返回时都会发送.

笔记

  • unregister() 不会从服务器端或客户端调用
  • 我每隔一段时间就用注册ID提高一次祝酒,所以我可以验证它在客户端和服务器之间是一样的:
客户端

在此输入图像描述

服务器端
2015-08-02 12:31:22,383 INFO - request_2145354041215926507 
                        update push token for user: XXXXXXXX,
                        push_token: ...me1GttmSRipnWsCGVUueK7e0nk
Run Code Online (Sandbox Code Playgroud)

use*_*234 5

添加包含您的包名称的类别 intent-filter

  <receiver
        android:name=".xxxxx"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <!-- Receives the actual messages. -->
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.xxxx" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)