我正在使用Google消息传递(只有一种方式,即服务器到客户端)来接收推送通知。我收到了这些,一开始一切都很好,但是现在,经过一周多一点的时间,我得到了多个通知:3在一个设备上,7个在另一个设备上。
我的理论是,设备使用不同的is注册,从而获得多个通知。
但为什么会这样呢?我正在使用Google的Android示例项目,并根据我的情况对其进行了调整,但我看不出是什么原因导致了这些多重注册。是因为注册ids过期了吗?
编辑:但是服务器上的所有registrationIds都不同。
EDIT2:我想我在活动的onDestroy()-method中调用了GCMRegistrar(context),但实际上并没有在服务器上注销注册id。这可能就是问题所在吗?如果注册id未注册,意味着什么?
发布于 2014-04-15 10:13:34
在考虑了您最近的评论( GCM引擎可能在它确定需要时更改注册ID,并且可能在没有事先警告的情况下在任何时候发生这种情况,这就是为什么您应该始终检查最后一个注册ID是否与当前的注册ID匹配),我有这样的解决方案:
DeviceID:从应用程序中提取的ID。GCM_ID: GCM返回的Id。
现在,您必须确定的是,您从应用程序中生成的DeviceID应该是唯一的。您可以将设备配置的两个或多个属性组合在一起,以使其独一无二。
生成设备ID
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;
}希望这是你正在寻找的解决方案!
发布于 2014-04-14 16:10:17
即使没有看过您的代码,我猜问题是以下几点:
服务器没有检查注册的设备是否已经在数据库中注册,因此您有重复的条目,因此您要向同一个客户端发送几次相同的通知。
即使这样做,您也需要实现超时策略。在我的项目中,我有一个Thread,每次X时间都会向第三方服务器发送一个虚拟的HTTP请求,所以如果一个设备在一段合理的时间后无法发送它,那就是超时,我将它从数据库中删除。
我想解决这两个问题会解决你的问题。
发布于 2014-04-15 14:27:12
对于您的答案,这不是一个直接的解决方案/修复,但是GCMRegistrar(context)已经被废弃一段时间了。我会远离它,因为它是不建议使用的。
包com.google.android.gcm 不推荐的-请使用GoogleCloudMessaging API而不是这个客户端助手库-有关更多信息,请参见GCM客户端。
https://stackoverflow.com/questions/23064847
复制相似问题