首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCM -多个通知

GCM -多个通知
EN

Stack Overflow用户
提问于 2014-04-14 16:04:07
回答 4查看 1.3K关注 0票数 0

我正在使用Google消息传递(只有一种方式,即服务器到客户端)来接收推送通知。我收到了这些,一开始一切都很好,但是现在,经过一周多一点的时间,我得到了多个通知:3在一个设备上,7个在另一个设备上。

我的理论是,设备使用不同的is注册,从而获得多个通知。

但为什么会这样呢?我正在使用Google的Android示例项目,并根据我的情况对其进行了调整,但我看不出是什么原因导致了这些多重注册。是因为注册ids过期了吗?

编辑:但是服务器上的所有registrationIds都不同。

EDIT2:我想我在活动的onDestroy()-method中调用了GCMRegistrar(context),但实际上并没有在服务器上注销注册id。这可能就是问题所在吗?如果注册id未注册,意味着什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-15 10:13:34

在考虑了您最近的评论( GCM引擎可能在它确定需要时更改注册ID,并且可能在没有事先警告的情况下在任何时候发生这种情况,这就是为什么您应该始终检查最后一个注册ID是否与当前的注册ID匹配),我有这样的解决方案:

  1. 具有像registerDevice(GCM_ID,DeviceID)这样的webservice功能
  2. 现在从DB获取GCMIdColumn,其中DeviceIDColumn = DeviceID。如果这个GCMIdColumn != GCM_ID,那么更新。否则什么也不做。
  3. 如果没有包含DeviceIDColumn = DeviceID的行,则插入(GCM_ID,DeviceID)。

DeviceID:从应用程序中提取的ID。GCM_ID: GCM返回的Id。

现在,您必须确定的是,您从应用程序中生成的DeviceID应该是唯一的。您可以将设备配置的两个或多个属性组合在一起,以使其独一无二。

生成设备ID

代码语言:javascript
复制
public String getDeviceID(Context context) {
        TelephonyManager TelephonyMgr = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
        String szImei = TelephonyMgr.getDeviceId(); // Requires READ_PHONE_STATE
        String m_szDevIDShort = "35" + //we make this look like a valid IMEI
                Build.BOARD.length()%10+ Build.BRAND.length()%10 +
                Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 +
                Build.DISPLAY.length()%10 + Build.HOST.length()%10 +
                Build.ID.length()%10 + Build.MANUFACTURER.length()%10 +
                Build.MODEL.length()%10 + Build.PRODUCT.length()%10 +
                Build.TAGS.length()%10 + Build.TYPE.length()%10 +
                Build.USER.length()%10 ; //13 digits
        if(Utills.debug)
            Log.i("getDeviceID",szImei+"==XXX=="+m_szDevIDShort);
        return szImei+"==XXX=="+m_szDevIDShort;
    }

希望这是你正在寻找的解决方案!

票数 1
EN

Stack Overflow用户

发布于 2014-04-14 16:10:17

即使没有看过您的代码,我猜问题是以下几点:

服务器没有检查注册的设备是否已经在数据库中注册,因此您有重复的条目,因此您要向同一个客户端发送几次相同的通知。

即使这样做,您也需要实现超时策略。在我的项目中,我有一个Thread,每次X时间都会向第三方服务器发送一个虚拟的HTTP请求,所以如果一个设备在一段合理的时间后无法发送它,那就是超时,我将它从数据库中删除。

我想解决这两个问题会解决你的问题。

票数 2
EN

Stack Overflow用户

发布于 2014-04-15 14:27:12

对于您的答案,这不是一个直接的解决方案/修复,但是GCMRegistrar(context)已经被废弃一段时间了。我会远离它,因为它是不建议使用的。

包com.google.android.gcm 不推荐的-请使用GoogleCloudMessaging API而不是这个客户端助手库-有关更多信息,请参见GCM客户端。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23064847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档