当前位置: 首页 > 知识库问答 >
问题:

谷歌云消息逻辑解决方案

祁烨
2023-03-14

请任何一个建议我对我的Android应用程序的逻辑怀疑。

我的应用程序不需要注册即可使用。但是我需要向所有用户发送推送通知(比如GCM)。所以我制作了一个数据库表,如下所示

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

因此,逻辑如下

现在的问题是

情况1:当用户在手机中“清除数据”并重新启动应用程序时,将发生另一个注册过程。因此,当我们发送消息推送时,用户将获得多次(自上次gcmrecd出现在我们的数据库中)

因为它是一个简单的新闻应用程序,不需要用户注册。有人能给我一个解决方案吗?

提前感谢

共有3个答案

毛德华
2023-03-14

这里的代码将解决您的问题。。。。。

在启动屏幕中运行此代码。。。。。

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问题。。。

施飞雨
2023-03-14

是否为特定设备(在客户端)创建相同的注册ID?
如果是,请执行以下操作

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

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

编辑

在设备向GCM重新注册时,大多数情况下它会创建相同的注册id,所以您可以像我上面提到的那样在服务器端检查id重复。

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

璩浩广
2023-03-14

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

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

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

 类似资料:
  • 上面写着“Google Cloud Messaging(GCM)是一个免费服务”,但是为了使它能够运行,我需要在Google Cloud平台中创建一个项目,这需要花钱…那怎么免费呢?还是我错过了什么?

  • 更新:已弃用GCM,请使用FCM 如何将新的Google云消息集成到PHP后端?

  • 我使用新的GCM API来注册。方法的留档明确指出: 为GCM注册应用程序并返回注册ID。安装应用程序后,必须调用此函数一次,然后将返回的注册ID发送到服务器。 重复调用此方法将返回原始注册ID。 然而,在阅读本文时(http://developer.android.com/google/gcm/adv.html#reg-州),它指出有两种情况需要特殊处理: 另外还有两种情况需要特别注意: 应用程

  • 我正在尝试使用appengine实现GCM。我创建并部署了默认的appengine后端GCM模板。我创建一个GCM注册id: 然后,我使用模板中的默认注册endpoint将这个regID存储在appengine上。我的广播接收器如下所示: 这是我的舱单: BroadCastReceiver和intent服务在我的项目中是独立的类。appengine后端GCM是一个单独的模块。创建此模块期间: 编译

  • 我正在尝试在Android设备上使用一个简单的电话差距应用程序。因此,我遵循了所有步骤,创建了一个项目,该应用程序成功地与GCM服务器通信,并使用我的项目编号获取注册ID。 问题是我不能从服务器端与GCM通信。我最初是在Perl中这样做的,但是即使是GCM文档中的curl example也返回“401”。 他们的API访问密钥被列入了白名单,我试着删除它并创建新的几次。甚至尝试使用浏览器密钥而不是

  • 我正在尝试,为了实施新的GCM,我遵循Google get声明:http://developer.android.com/guide/google/gcm/gs.html 我被困在获取我的设备注册ID! 我的应用程序一直试图与谷歌服务器连接,这里我的错误日志: 这是我的活动代码,询问身份证: 这是我的服务代码 这是我的Android清单: 我遵循谷歌的指示,但我坚持这个服务不可用的错误, 我做错了