我有一个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取消注册特定设备?
答案 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()
现已弃用:
引用您应该致电的文档:
Instead use InstanceID.deleteToken() or InstanceID.deleteInstanceID().