在安卓系统中,使用注册ID从GCM注销设备

15

我在数据库表中有一份GCM注册用户及其对应的注册ID列表,每当该用户从表中删除时,我想要取消其注册。我在Stackoverflow上找到了许多示例,但大多数都是基于已经弃用的旧GCMRegistrar API。我正在使用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 注销特定设备?


1
哈哈,但是你在特定设备上运行这段代码,所以它会注销该特定设备... - Selvin
我正在特定用户设备上运行“注册”方法,但我必须从管理员设备注销该用户。 - Osman Esen
1
管理员设备?在GCM中没有这样的东西。 - Selvin
注册后将regID保存在SharedPreferences中,然后发送到第三方服务器进行注册。如果用户点击注销,则将regid发送到第三方服务器进行注销,然后执行gcm注销操作... - Selvin
当一个应用被卸载时,如何向我的服务器发送一个请求,以从我的数据库表中删除该应用的 ID,因为当一个应用被卸载时,我无法执行任何操作。 - Sudhanshu Gaur
显示剩余3条评论
2个回答

21

这个方法可以解决问题:

gcm.unregister();

然而,gcm.unregister() 已经被弃用了,因此,您必须使用其中之一:

InstanceID.deleteToken() 或 InstanceID.deleteInstanceID()。

这些方法需要以下参数:

public void deleteToken (String authorizedEntity, String scope)

作为授权实体,您想要删除的实体是...

// 以下说明仅适用于 "取消注册"

所以,基于您的评论:

  

但让我困惑的是,unregister() 方法不带注册   Id作为参数,这使得无法注销特定设备。

那是因为您期望它以一种它不支持的方式工作。看起来您想能够发送带参数的 http 请求来取消注册(e.g. "http://www.gcmserver.com?unregisterid=xxxx"),但这不是它的工作方式,根据 Google 的文档,它的工作方式如下:

  

取消注册的操作

     

应用程序在卸载设备后可以自动取消注册。但是,此过程并不会立即发生,因为 Android 不提供卸载回调。在这种情况下发生的情况如下:

     

最终用户卸载应用程序。

     

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

     

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

     

GCM 客户端接收消息并查询包管理器是否已配置广播接收器来接收它,返回 false。

     

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

     

GCM 服务器标记要删除的注册 ID。

     

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

     

GCM 返回一个 NotRegistered 错误消息给第三方服务器。

     

第三方删除注册 ID。

所以,基于此,gcm.unregister() 方法实际上是将该设备标记为删除(将其视为强制执行第一步而不实际卸载应用程序),让服务器知道它不再需要获得通知,同时不需要将 "Id" 作为参数意味着它正在引用该特定设备。

谢谢!


GCM注销ID需要多长时间?我尝试卸载应用程序并通过GCM发送消息。然后,我安装了该应用程序,但我仍然可以使用旧的GCM ID发送消息。另一个问题是:如果用户重新安装应用程序怎么办?在这种情况下,设备会收到两条消息。因为在重新安装应用程序期间,如果GCM不尝试发送消息,则不会注意到应用程序已被卸载。如果我在将设备注册到GCM之前始终调用gcm.unregister(),那么我能处理这些情况吗? - Eren
1
如果用户注销应用程序,我想取消注册GCM怎么办?是否需要创建一个新的IntentService来取消注册? - JGPhilip

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接