使用Android中的注册ID从GCM取消注册设备

时间:2015-01-21 00:00:25

标签: android push-notification google-play-services google-cloud-messaging

我有一个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取消注册特定设备?

2 个答案:

答案 0 :(得分:21)

这种方法可以解决问题:

gcm.unregister();

但是,现在不推荐使用gcm.unregister(),因此,您必须使用以下方法之一:

  

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

这些方法采用以下参数:

public void deleteToken (String authorizedEntity, String scope)

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

//以下说明仅适用于" UNREGISTER"

所以,根据你的评论:

  

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

那是因为你期望它以一种它没有的方式运作。看起来您希望能够将http参数传递给uregister(例如" http://www.gcmserver.com?unregisterid=xxxx"),而这不是它的工作方式,这就是它的工作方式基于谷歌的文档:

  

取消注册的工作原理

     

应用程序可以自动取消注册   从设备中卸载。但是,此过程不会发生   马上,Android没有提供卸载回调。什么   在这种情况下发生如下:

     

最终用户卸载该应用程序。

     

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

     

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

     

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

     

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

     

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

     

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

     

GCM向第三方服务器返回NotRegistered错误消息。

     

第三方删除注册ID。

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

问候!

答案 1 :(得分:4)

unregister()现已弃用:

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

引用您应该致电的文档:

Instead use InstanceID.deleteToken() or InstanceID.deleteInstanceID().