当前位置: 首页 > 知识库问答 >
问题:

GCM每次发送不同的注册ID

苗运珧
2023-03-14

我对Android的GCM服务有点“问题”。关键是,每次我请求注册id时,GCM服务器都会返回不同的注册id。最糟糕的是,在进行测试后,旧的和新的都正常工作!!(我向老用户和新用户发送推送消息,我的应用程序正在接收来自每一个用户的推送!!)。

这是AsyncTask我正在使用GCMAndroid服务器中的寄存器:

public class AltaGCM extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
        int contador = 0;
        try{
           regId = gcm.register(CrisolGooglePlayServicesUtils.SENDER_ID);
        } catch (IOException e) {
            statusCode = -1;
        }
        return null;
    }

    @Override
    protected void onCancelled() {

    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected void onPostExecute(Void result) {
        listener.respuestaGCM(statusCode, regId);
    }

    @Override
    protected void onProgressUpdate(Void... values) {

    }
}

我不知道我做错了什么,但是,这已经发生在我身上两个月了(或多或少)。在我从来没有遇到过这个问题之前,GCM服务器通常会返回相同的注册id(不是每次,但有时会)。。。。。。。

我不知道每次收到不同的注册号是正常的还是我做错了什么。

非常感谢!

共有1个答案

田硕
2023-03-14

使用两个不同的工作注册ID注册的GCM可能重复

看看@nunofmendes提供的答案

有时Google会更改注册ID,您将有多个ID关联。发送通知的服务器(您的服务器)必须使用新ID更新数据库。

有关更多信息,请查看此文档:

http://developer.android.com/google/gcm/adv.html

上面写着:

在服务器端,只要应用程序运行良好,一切都应该正常工作。然而,如果应用程序中的一个bug触发了同一设备的多个注册,则很难协调状态,最终可能会出现重复消息。

GCM提供了一种称为“规范注册ID”的工具,可以轻松地从这些情况中恢复。规范注册ID定义为应用程序请求的最后一次注册的ID。这是服务器向设备发送消息时应使用的ID。

如果稍后尝试使用不同的注册ID发送消息,GCM将像往常一样处理请求,但它将在响应的registration_id字段中包含规范注册ID。请确保用此规范ID替换存储在服务器中的注册ID,因为最终您使用的ID将停止工作。

 类似资料:
  • 在我的应用程序中,我有以下代码可注册到GCM服务: 当我运行这段代码时,我在服务器中看到我的设备用2个不同的注册了两次,当服务器发送推送时,设备收到2条消息。 这是正常的事情吗?有没有办法确保只有一个?

  • 我的客户机/服务器上的推送通知设备注册管理有一个小问题。 同样,这里的问题是,我有两个或更多的注册ID都可以工作(如果我旧的一个在尝试从服务器发布消息时不工作,这不会有问题,因为我可以简单地清理它)。

  • 我已经从中看到了“GCM体系结构概述”http://developer.android.com/guide/google/gcm/gcm.html.文档说,当android应用程序注册GCM时,会调用onRegistered(上下文c,字符串regId),其中包含regId,然后用户将该regId发送到其服务器。该文件称“谷歌可能会定期刷新注册ID”。我的问题是,我怎么知道谷歌已经为用户刷新了re

  • 您好,我想将gcm添加到我的应用程序中。我的应用程序是一个新闻应用程序。用户可以在注册后查看新闻。应用程序询问用户兴趣(经济、运动、汽车等)并保存它们。我想从php和mysql向用户发送消息作为通知。我必须决定将哪些新闻发送给哪些用户。所以我需要注册证。 是Android设备号吗?还是Android设备谷歌账号和Android设备号的组合 还是Android设备google帐户和Android设备

  • 我想注册/注销用于接收GCM消息的BroadcastReceiver。我已声明并草签广播接收器。在我的onResume()中初始化,但在我下次启动应用程序时在onPause()中注销后,它将不再发送消息,除非我再次发送regId并向GCM服务器注册。 广播接收者是否有责任不发送消息?还是必须在清单文件中注册BroadcastReceiver?? 如有任何建议,我将不胜感激。 更新: 有趣的是,如果

  • 在GCM Advanced Topics中,在“为什么不应该很少注销”标题下,有两个关于注册的断言似乎存在冲突。 第一: “regID将应用映射到设备。它与特定登录用户无关。” 我认为映射是一对一的对应(或者应该是)。 第二: “您的应用服务器应维护当前用户和注册ID之间的映射。” 然而,第一项陈述声称没有这种联系。(假定“当前用户”已使用应用服务器“登录”,但文档中未对此进行指定。) 我的问题是