Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SDK在几个小时后从GCM收到NotRegistered错误 问题_Android_Sdk_Google Cloud Messaging - Fatal编程技术网

Android SDK在几个小时后从GCM收到NotRegistered错误 问题

Android SDK在几个小时后从GCM收到NotRegistered错误 问题,android,sdk,google-cloud-messaging,Android,Sdk,Google Cloud Messaging,我正在编写Android SDK,它应该从SDK服务器端接收GCM推送消息。推送消息发送成功数小时后,GCM服务器返回NotRegistered错误: { "multicast_id":6205350692941230304, "success":0, "failure":1, "canonical_ids":0, "results": [ { "error":"NotRegistered"

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

{
    "multicast_id":6205350692941230304,
    "success":0,
    "failure":1,
    "canonical_ids":0,
    "results":
    [
        {
            "error":"NotRegistered"
        }
    ]
}
客户端的
注册ID
没有更改,服务器端将使用该令牌进行更新

如何解决
注册ID
问题?有两个侦听器(一个在SDK中,一个在应用程序中)是问题吗?

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

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

SDK和应用程序的
senderId
不同

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

笔记
  • unregister()
    既不是从服务器端调用,也不是从客户端调用
  • 我每隔一段时间就会用注册id敬酒一次,这样我就可以验证客户端和服务器之间的注册id是否相同:
客户端

服务器端
将带有包名的类别添加到
intent过滤器中

  <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>

注册ID的生成不仅包括设备,还包括应用程序和发件人ID。如果我正确理解了您的体系结构,您希望实现GCM客户端库(您的SDK),使您的应用程序能够通过库使用GCM吗?如果这是真的,确保你只注册一次

SDK和应用程序的senderId不同


我假设这就是问题所在,您必须使用发件人id(例如XYZ)注册每个应用程序,并在服务器上使用相同的发件人id发送通知。无法使用ABC作为发件人id向已注册发件人id XYZ的设备发送通知

谢谢!能否请您详细说明为什么这会起作用,并添加一些文档链接?我希望这是一个权威的,规范的回答。谢谢你的回答。你能提供你索赔的支持链接吗?对不起,恐怕不行。原因是你使用的是不推荐的API版本,谷歌删除了旧的官方文档,但是我知道你必须使用相同的发送者id来发送和接收,因为我也开发了GCM应用程序(其他任何东西都没有意义,因为这是为了安全,以保证服务器有权向设备发送通知)这里有指向新InstanceID API的链接,我强烈建议您同时使用新InstanceID和新GCM API
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;
}
2015-08-02 12:31:22,383 INFO - request_2145354041215926507 
                        update push token for user: XXXXXXXX,
                        push_token: ...me1GttmSRipnWsCGVUueK7e0nk
  <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>