Google Cloud消息逻辑解决方案

时间:2014-06-04 08:00:02

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

请任何人就我对Android应用程序的逻辑怀疑向我提出建议。

我的申请不需要注册使用。但我需要向所有用户发送推送(例如GCM)。所以我创建了一个数据库表如下

user_id      |     gcm_regid      
-------------+-----------------------------------------------
1            |   ( reg id get from google at register() )
-------------+-----------------------------------------------
2            |   ( reg id get from google at register() )
-------------+-----------------------------------------------

所以逻辑如下

enter image description here

现在问题是

案例1 :当用户在手机中“清除数据”并重新启动应用时,将会发生其他注册过程。因此,当我们发送推送通知时,用户将获得多次(自我们的数据库中存在的最后一个gcmregid)

由于它是一个简单的新闻应用程序,无需用户注册。所以有人请给我一个解决方案吗?

提前致谢

3 个答案:

答案 0 :(得分:0)

您是否为特定设备创建了相同的注册ID(在客户端)?
如果是,请遵循

服务器端首先检查数据库中是否存在注册ID,然后更新其信息,例如 updateTime ,否则注册为新ID。在这种情况下,您的服务器将按设备发送每条消息。

否则
如果注册ID在每个注册过程中有所不同,那么 gcm 将自行处理,即。一段时间后它不会向旧的注册ID发送消息。(在这种情况下,设备只会获得一条消息,因为它只有一个唯一的注册ID)

修改

在使用 GCM重新注册设备时,大多数情况下它会创建相同的注册ID,因此您检查服务器端的ID重复,如上所述。

有时Google会更改注册ID,并且您有多个ID与一个设备相关联(仍然google / GCM只向设备发送一个通知,因为GCM服务器会向该设备的新ID发送消息),在这种情况下检查规范ID。有关详细信息,请参阅Canonical IDs

答案 1 :(得分:0)

通过将数据存储在设备的外部存储器中,可以非常可靠地解决用户清除应用程序数据(或卸载和安装应用程序)的问题。如果共享首选项中没有数据,请尝试在存储在外部存储器中的文件中找到它。卸载应用程序时,不会删除此类文件。它仍然可以由用户手动删除,但是你无能为力。

大多数情况下,在同一设备上多次注册到GCM将返回相同的注册ID,因此您的服务器不会为同一设备提供多个注册ID(假设它之前检查是否存在注册ID更新数据库)。

如果同一设备的注册ID发生更改,您可以通过为每个设备创建唯一的实例标识符来检测它,并将该标识符与注册ID一起存储在数据库中。将实例标识符+注册ID发送到服务器时,首先检查数据库中是否存在该实例标识符。如果存在,则用新的注册ID替换旧的注册ID(与该实例标识符相关联)。您应该将实例标识符存储在设备的外部存储器中。

答案 2 :(得分:0)

这里的代码可以解决你的问题......

在启动画面中运行此代码.....

class GCMRegisterAsync extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {

            GCMRegistrar.checkDevice(yourclass.this);
            GCMRegistrar.checkManifest(yourclass.this);
            final String regId = GCMRegistrar
                    .getRegistrationId(yourclass.this);
            if (regId.equals("")) {
                GCMRegistrar.register(yourclass.this, "xxxxxxxxxxxx");
            } else {
                Log.d("test", "Already registered");
            }

            GCMRegistrar.checkDevice(yourclass.this);
            Log.d("info",
                    "unregistereddd....."
                            + GCMRegistrar.getRegistrationId(yourclass.this));
            GCMRegistrar.checkManifest(yourclass.this);
            if (GCMRegistrar.isRegistered(yourclass.this)) {
                Log.e("info gcm id is ",
                        GCMRegistrar.getRegistrationId(yourclass.this));
            }

        secondclass.regId = GCMRegistrar
                    .getRegistrationId(yourclass.this);
            if (RegisterHalf.regId.equals("")) {
                // replace this with the project ID
                GCMRegistrar.register(yourclass.this, "xxxxxxxxxxxx");
                Log.e("reg id is ",
                        GCMRegistrar.getRegistrationId(yourclass.this)
                        );


            } else {
                Log.e("info", "already registered as" + RegisterHalf.regId);
            }

            return null;
        }
    }

在此粘贴代码后,您将id保存到数据库..

SharedPreferences pref = getSharedPreferences(
                        com.omega.expert.classes.SharedPrefConstants.pref_name, MODE_PRIVATE);
                GCMRegistrar.checkDevice(yourclass.this);
                GCMRegistrar.checkManifest(yourclass.this);

                regId = GCMRegistrar.getRegistrationId(yourclass.this);
                Log.e("test", "Reg id:" + regId);

                pref.edit().putString(com.omega.expert.classes.SharedPrefConstants.key_gcmid, regId)
                        .commit();

regId 是您的设备ID ... 保存到数据库....

我已成功实施。这个 您的多设备ID问题将得到解决......