GCM出现“错误:未注册”的问题

41

我成功测试了我的GCM代码。

但是使用完全相同的代码,我无法收到GCM推送,而是收到以下错误:

GCM错误:未注册。


3
帮助你凭借你的不充分解释几乎是不可能的。 - T-D
1
@T-D 对不起...我已经修复了那个问题,谢谢你的诚实! - LKM
我也有同样的问题@LKM。你能帮助我吗? - Mamta Kaundal
8个回答

54

GCM响应未注册表示以下内容:“如果是未注册,则应从您的服务器数据库中删除注册ID,因为该应用程序已从设备中卸载或未配置广播接收器以接收com.google.android.c2dm.intent.RECEIVE意图。”来自文档。检查何种情况下会出现此错误,当应用程序从设备中卸载或在AndroidManifest中描述不正确的广播接收器时。您可以使用我的测试GCM服务器测试GCM功能。希望这能帮助您。


请问如何在服务器端知道哪些 ID 没有注册,以便我可以将它们从我的数据库中删除? - Sudhanshu Gaur
@DB 当你需要从服务器的数据库中删除注册ID时,只有一种方法可以知道。从GCM服务器获取“NotRegistered”错误意味着您尝试使用的registration_id无效,应将其删除。此外,您的服务器应准备好处理来自GCM的cannonical_id响应。我在这里解释了cannonical_id的含义http://stackoverflow.com/questions/26826869/regarding-canonical-ids-in-gcm-google-cloud-messaging/26827470#26827470 - Samik
@DB 你也可以通过我的测试推送服务器 http://1-dot-sigma-freedom-752.appspot.com/gcmpusher.jsp 诊断你的 registration_id。 - Samik
1
嗨,我的应用程序在使用GCM时出现了奇怪的问题。在我的GCMRegistrationService中,当我从InstanceId API获取令牌时,有时返回的令牌无效,并且使用它会出现“NotRegistered”错误。这通常发生在用户卸载应用程序然后重新安装后。在调试时,我强制从adb启动了GCMInstanceIdListener,InstanceId API提供了一个新的有效令牌。因此,我得到的第一个令牌是错误的,而第二个令牌是有效的。对此有什么想法吗? - akshayt23
@user2558050,请确保您的客户端不会过多地请求令牌,它应该只请求一到两次(包括更新应用程序版本)。其次,请确保您的服务器正确处理cannonical_id字段,并在必要时将旧令牌替换为新令牌。这些因素中的一个可能会影响出现“NotRegistered”错误。此外,请确保您的服务器使用客户端获取的相同令牌,即您的客户端应以可靠的方式将令牌传递给服务器。 - Samik
@Samik,我实际上正在使用第三方服务来向我的应用程序发送通知,我们没有从自己的服务器使用GCM。因此,处理这个问题实际上变得棘手起来。 我只是将令牌发送到第三方服务,如果它无效并且抛出NotRegistered错误,则没有办法让我意识到它。 而且,我实际上并没有请求太多次令牌,只是在应用程序启动时第一次请求,以及在onTokenRefresh()调用中随后请求。我似乎无法理解为什么InstanceId API会提供无效的令牌。 - akshayt23

18
如果您正在使用设备进行测试,则需要在获取令牌并重新进行测试之前删除InstanceID,因为一旦覆盖APK,它将注销该InstanceId并出现“ NotRegistered”错误。因此,在您的RegisterIntentService类中,在onHandleIntent函数中执行以下操作:
InstanceID instanceID = InstanceID.getInstance(this);
try
{
    instanceID.deleteInstanceID();
} catch(IOException e) 
{
    e.printStackTrace();
}
instanceID = InstanceID.getInstance(this);

你只在调试版本上这样做吗? - Jeremy
仅在调试模式下。 - Rhodesie
这个问题的第一个副本被版主删除的原因在其下方的评论中可见。在此重现:“请不要在多个问题中发布相同的答案。发表一个好的答案,然后投票/标记关闭其他问题作为重复。如果问题不是重复的,请根据问题调整您的答案。” - halfer

9
当GCM认为设备无法处理消息时,会出现“未注册”错误。如果应用程序已被卸载或配置不正确以处理消息,则会发生此情况:

enter image description here

根据@Samik和@O'Rilla的答案,我建议按照以下步骤进行:

  1. 从Android设备卸载当前安装
  2. 确保您已在AndroidManifest.xml中的<application>节点中定义了<receiver><sender>
  3. 确保您在<receiver>中有正确的<category android:name="COM.COMPANY.YOURAPP" />
  4. 确保接收器的实现正确

第二步已经修复了——一个愚蠢的疏忽,但是在试了几天找到根本原因后,你的答案节省了我的时间。谢谢@Roozbeh。 - RobbiewOnline

5

如果您确信您的代码是正确的,但仍然出现错误

{"error": "NotRegistered"} 

尝试从手机手动卸载应用程序,然后再次运行它(您的设备将获得新的注册ID)。至少在我的情况下,问题已经解决了!


在我的情况下,问题也得到了解决!我尝试删除 InstanceID,然后再次发送请求。但是只有当我卸载了应用程序时才成功(而我之前一直在尝试删除 instanceID)。 - Alexey Shevelyov

2

当我将GCM接收器放在应用程序之外的清单文件中时,出现了这个错误。 将接收器移动到应用程序范围内,一切正常。 现在非常高兴。

<application>
...
<receiver>
...
</receiver>
...
</application>

2

我曾使用过已经过时的GCM代码:

if (gcm == null) {
                gcm = GoogleCloudMessaging.getInstance(this);
            }
            String regId = gcm.register(SENDER_ID);
            msg = "Device registered, registration ID=" + regId;

当尝试切换到新方法时:

InstanceID instanceID = InstanceID.getInstance(this);
            String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
                    GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

我也遇到了同样的错误,困扰我整整两天。

尝试了书中所有方法后,最终解决问题的方法是在开发者控制台中禁用GCM,然后重新启用,并前往此处:https://developers.google.com/mobile/add 为我的Android应用程序生成一个新的google-services.json文件。

还需要注意的是,RegistrationIntentService必须位于您的包的根目录下,否则它将无法正常工作!(请参阅此示例以将gcm实现到Android中:https://github.com/google/gcm

希望这能帮助某些人,因为我在这上面浪费了好几天!!! ><


1

1
这意味着您提供了错误的注册ID。 因此,首先运行您的移动应用程序,您的注册ID将作为令牌出现。 将此令牌作为注册ID放入您的应用程序服务器代码中。 对于App ID,请提供服务器ID,您可以从Google开发人员控制台、您的项目和凭据中获取。 对于发送者ID,请设置您的项目ID,该ID可以从开发人员控制台中的项目设置中获得。

我正在使用GCM通过网络发送通知,但最近在发送某些通知时出现了相同的消息。人们所说的注册ID在哪里?我收到了这条消息:{"multicast_id":63135.....,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"}]},而我的清单文件看起来像是这样的:{"gcm_sender_id": "10395...." } - kneidels

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