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

Unregister a device from GCM using registration Id in Android

我在数据库 table 中有一个 GCM 注册用户列表及其相应的注册 ID,我实际上想在从 table 中删除 he/she 时注销用户.我在 Whosebug 中找到了很多示例,但其中大部分都是基于旧的 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());
        }
}

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

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 注销特定设备?

这个方法可以解决问题:

gcm.unregister();

但是,gcm.unregister() 现已弃用,因此,您必须使用其中之一:

InstanceID.deleteToken() or InstanceID.deleteInstanceID().

这些方法采用以下参数:

public void deleteToken (String authorizedEntity, String scope)

正在授权实体您要删除的实体...

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

因此,根据您的评论:

But it confuses me that unregister() method does not take registration Id as an argument, which makes it impossible to unregister a specific device.

那是因为您期望它以一种它不会的方式工作。看起来你希望能够发出一个将参数传递给 uregister 的 http 请求(例如“http://www.gcmserver.com?unregisterid=xxxx”),但这不是它的工作方式,这是它基于 Google 的工作方式的文档:

How unregistration works

An application can be automatically unregistered after it is uninstalled from the device. However, this process does not happens right away, as Android does not provide an uninstall callback. What happens in this scenario is as follows:

The end user uninstalls the application.

The 3rd-party server sends a message to GCM server.

The GCM server sends the message to the device.

The GCM client receives the message and queries Package Manager about whether there are broadcast receivers configured to receive it, which returns false.

The GCM client informs the GCM server that the application was uninstalled.

The GCM server marks the registration ID for deletion.

The 3rd-party server sends a message to GCM.

The GCM returns a NotRegistered error message to the 3rd-party server.

The 3rd-party deletes the registration ID.

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

此致!

unregister() 现已弃用:

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

引用您应该调用的文档:

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