我正在使用Google Cloud Messaging(仅限一种方式,即服务器到客户端)来接收推送通知。 我收到这些,起初一切都很好,但现在,经过一个多星期,我得到了多个通知; 3在一台设备上,7在另一台设备上。
我的理论是设备注册了不同的ID,从而获得多个通知。
但为什么会这样呢?我正在使用Googles示例Android项目,将其改编为我的,但无法看到导致这些多次注册的原因。 是因为注册ID已经过期了吗?
编辑:服务器上的所有registrationIds都不同。
EDIT2:我想在活动的onDestroy()方法中调用了GCMRegistrar(context),但实际上并没有在我的服务器上取消注册注册ID。可能是问题吗?如果注册ID未注册,这意味着什么?
答案 0 :(得分:2)
即使没有看过您的代码,我想问题如下:
服务器没有检查已注册的设备是否已在数据库中注册,因此您有重复的条目,因此您将多次向同一客户端发送相同的通知。
即使这样做,您需要来实施超时策略。在我的项目中,我有一个Thread
,每次X都会向第三方服务器发送一个虚拟HTTP请求,所以如果一个设备在一段合理的时间后无法发送它,那么它是一个超时并且我将其删除来自数据库。
我想解决这两个问题将解决您的问题。
答案 1 :(得分:1)
反思您的最新评论 (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;
}
希望这是您正在寻找的解决方案!
答案 2 :(得分:1)
这不是直接解决/修复您的答案,但GCMRegistrar(context)
已暂时弃用了一段时间。我会远离它,因为不建议使用它。
包com.google.android.gcm DEPRECATED - 请使用 GoogleCloudMessaging API代替此客户端帮助程序库 - 请参阅 GCM客户端了解更多信息。
答案 3 :(得分:0)
最有可能是从服务器端多次发送