GCM - 多个通知

时间:2014-04-14 16:04:08

标签: android notifications push-notification google-cloud-messaging

我正在使用Google Cloud Messaging(仅限一种方式,即服务器到客户端)来接收推送通知。 我收到这些,起初一切都很好,但现在,经过一个多星期,我得到了多个通知; 3在一台设备上,7在另一台设备上。

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

但为什么会这样呢?我正在使用Googles示例Android项目,将其改编为我的,但无法看到导致这些多次注册的原因。 是因为注册ID已经过期了吗?

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

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

4 个答案:

答案 0 :(得分:2)

即使没有看过您的代码,我想问题如下:

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

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

我想解决这两个问题将解决您的问题。

答案 1 :(得分:1)

反思您的最新评论 (GCM引擎可能会在确定需要时更改注册ID,这可能会在没有事先警告的情况下随时发生,这就是为什么您应该始终检查上一个注册ID是否与当前注册ID匹配),我有这个解决方案:

  1. 拥有像registerDevice(GCM_ID,DeviceID)
  2. 这样的web服务功能
  3. 现在从DB获取GCMIdColumn,其中DeviceIDColumn = DeviceID。如果这个GCMIdColumn!= GCM_ID,那么更新。别无所求。
  4. 如果没有具有DeviceIDColumn = DeviceID的行,则插入(GCM_ID,DeviceID)。
  5. 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)

最有可能是从服务器端多次发送