GCM 如何使用 BroadCastReceiver 处理应用程序
Posted
技术标签:
【中文标题】GCM 如何使用 BroadCastReceiver 处理应用程序【英文标题】:How does GCM handle apps with BroadCastReceiver 【发布时间】:2015-08-09 05:34:30 【问题描述】:我很难理解<intent-filter>
如何处理 BroadCastReceiver 的基本概念。使用下面的代码我设置了一个处理任何下游消息的 WakeFullBroadCastReciever。我的代码运行良好,我能够从 GCM 接收消息,但从概念上讲,<receiver>
是如何识别要打开哪个应用程序的。在流程图中没有 Google 将我的 packageName 用于匹配<category android:name>
。从概念上讲,我在哪里出错了,gcm 如何使用 gcm 处理两个应用程序设备上的服务。
<receiver
android:name=".GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.gcmexample" />
</intent-filter>
</receiver>
【问题讨论】:
【参考方案1】:这是一个闭源实现,所以我不能确定,但我假设您在服务器端使用的注册令牌包含 Google 系统建立连接所需的信息。换句话说,是云中的 GCM 服务或手机上的 Play 服务客户端将注册令牌及其关联的发件人 ID 与应用程序的包名称相关联。
【讨论】:
【参考方案2】:当您的应用注册自己以获取其推送通知令牌时,您需要执行以下操作:
InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
请在此处查看完整示例: https://developers.google.com/instance-id/
InstanceID
在这里用于为您的应用程序的每个实例获取唯一令牌。但它也可以用来做许多其他事情,包括验证应用程序的包名和签名。 (更多信息请看这里:https://developers.google.com/instance-id/)
因此,虽然我不能 100% 确定(因为它是封闭源代码),但当您注册 GCM 令牌时,Google 可能会传递您的应用程序的包名。为了让您收到推送通知,Google GCM 服务器可以简单地将包名连同通知本身一起发送。然后,您设备上的 Google Play 服务应用将收到此通知并将其路由到您设备上的正确应用。
由于 InstanceID 机制,这可能不会全部显式发生,但最终会发生这种情况。
【讨论】:
【参考方案3】:我认为this topic 上的两个答案都可以回答您的问题。
简而言之:在获取 API 密钥时,您应该已将应用程序包名称和发布签名密钥的 SHA-1 签名提供给 Google 控制台。其余的通过 Play Services 完成。
【讨论】:
我没有为 android studio 注册我的 SHA,我也没有给出我的包名.. 我只创建了一个服务器密钥。 确实,GCM 注册流程已经改变。但是“服务器密钥”是什么意思?你必须在这个页面上developers.google.com/cloud-messaging/gcm#senderid 所以我可以看到,API Key 注册需要你的包名。以上是关于GCM 如何使用 BroadCastReceiver 处理应用程序的主要内容,如果未能解决你的问题,请参考以下文章