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

在Android中使用注册ID从GCM注销设备

阎枫涟
2023-03-14

我在一个数据库表中有一个GCM注册用户列表及其相应的注册ID,我实际上想在用户从表中删除时注销该用户。我在Stackoverflow中发现了很多示例,但大多数示例都基于旧的GCMRegistarAPI,现在已经不推荐使用了。我正在使用GoogleCloudMessaging API,并通过以下方法注册用户:

private void registerUser(){
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getBaseContext());
        String regId = "";
        try {
            regId = gcm.register(getString(R.string.project_number));
            Log.i("registrationId", regId);
        } 
        catch (IOException e) {
            Log.i("Registration Error", e.getMessage());
        }
}

我有一个管理员应用程序,它充当第三方应用程序服务器,因为它向所有用户推送通知。我想注销一个特定的用户从这个管理员应用程序与以下方法:

private void unRegister(String regId) {

        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getBaseContext());
        try {
            gcm.unregister();
        } 
        catch (IOException e) {     
        System.out.println("Error Message: " + e.getMessage());
        }

   }

但unregister()方法并没有将注册Id作为参数,这让我很困惑,这使得无法注销特定设备。有没有办法通过注册Id从GCM注销特定设备?。

共有2个答案

廖令
2023-03-14

现在不建议使用:

https://developers.google.com/android/reference/com/google/android/gms/gcm/GoogleCloudMessaging.html#unregister()

引用您应该调用的文档:

Instead use InstanceID.deleteToken() or InstanceID.deleteInstanceID().
西门伟
2023-03-14

方法实现了以下功能:

gcm.unregister();

然而,gcm。unregister()现在已不推荐使用,因此,您必须使用以下选项之一:

实例ID。deleteToken()或InstanceID。deleteInstanceID()。

这些方法采用以下参数:

public void deleteToken (String authorizedEntity, String scope)

被授权实体您要删除的实体...

//以下解释仅适用于“注销”

因此,根据您的评论:

但unregister()方法并没有将注册Id作为参数,这让我很困惑,这使得无法注销特定设备。

这是因为您希望它以一种它不希望的方式工作。似乎您希望能够发出http请求,将参数传递给uregister(例如。“http://www.gcmserver.com?unregisterid=xxxx)这不是它的工作方式,这是基于谷歌文档的工作方式:

取消注册的工作原理

从设备卸载应用程序后,可以自动取消注册。然而,这个过程不会马上发生,因为Android不提供卸载回调。在这种情况下发生的事情如下:

最终用户卸载应用程序。

第三方服务器向GCM服务器发送消息。

GCM服务器将消息发送到设备。

GCM客户端接收消息,并向Package Manager查询是否有配置为接收消息的广播接收器,返回false。

GCM客户端通知GCM服务器应用程序已卸载。

GCM服务器将注册ID标记为删除。

第三方服务器向GCM发送消息。

GCM会向第三方服务器返回一条没有注册的错误消息。

第三方删除注册ID。

因此,基于这一点,什么是gcm方法。unregister()实际上是将该设备标记为删除(将其视为在不实际卸载应用程序的情况下强制执行流程的第一步),让服务器知道它不再需要获取通知,并且不将“Id”作为参数,这意味着它正在引用该特定设备。

当做

 类似资料:
  • 虽然我尝试了关于这个问题的其他答案,但它无法解决。发件人ID正确,权限已添加,API密钥为true。 我使用此帖子创建项目:http://developer.android.com/guide/google/gcm/gs.html#server-应用程序 它返回空字符串。

  • 您好,我想将gcm添加到我的应用程序中。我的应用程序是一个新闻应用程序。用户可以在注册后查看新闻。应用程序询问用户兴趣(经济、运动、汽车等)并保存它们。我想从php和mysql向用户发送消息作为通知。我必须决定将哪些新闻发送给哪些用户。所以我需要注册证。 是Android设备号吗?还是Android设备谷歌账号和Android设备号的组合 还是Android设备google帐户和Android设备

  • 我的客户机/服务器上的推送通知设备注册管理有一个小问题。 同样,这里的问题是,我有两个或更多的注册ID都可以工作(如果我旧的一个在尝试从服务器发布消息时不工作,这不会有问题,因为我可以简单地清理它)。

  • 我尝试使用GCM发送APN。设备注册OK,GCM和IOS设备令牌被接收。当我尝试发送有效载荷没有"通知"节点: 一切正常。 但是我想处理应用程序在后台时的通知 根据文档,我将有效负载修改为: 第一次尝试: 但没有收到通知。 第二次尝试: 然后应用程序不会收到任何通知,即使我删除了通知节点。所以我必须移除它,重新安装,接收新的代币。 第二期: 我试图检查APN使用NWPusher,但得到错误:无效令

  • 问题内容: 我知道C2DM注册会过期,并且您应该定期刷新注册ID。GCM就是这种情况吗?通过查看Android GCM指南上的以下代码(如下所示),您似乎只需要执行一次,而无需刷新,但是我看不到任何地方都明确编写了该代码,因此我只想检查一下。 问题答案: 编辑:该答案已过时,我不知道目前的行为是什么 我自己找到了答案。根据docs中的示例,您不需要每次都明确地重新注册。 此外,与以前版本的GCM和

  • 我知道C2DM注册会过期,您应该定期刷新注册ID。GCM是这样吗?通过查看Android GCM指南(如下所示)上的以下代码,似乎你只做了一次,不需要刷新,但我没有看到任何地方明确写入,所以我只是想检查一下。