GCM 如何处理带有 BroadCastReceiver 的应用程序
How does GCM handle apps with BroadCastReceiver
我很难理解关于 <intent-filter>
如何处理 BroadCastReceiver 的基本概念。使用下面的代码我设置了一个 WakeFullBroadCastReciever 来处理任何下游 messages.My 代码运行良好,我是能够接收来自 GCM 的消息,但从概念上讲,<receiver>
如何能够识别哪个应用程序 open.No 在流程图中的哪个位置 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>
这是一个闭源实现,所以我不能确定,但我假设您在服务器端使用的注册令牌包含 Google 的系统制作联系。换句话说,是云中的 GCM 服务或 phone 上的 Play 服务客户端将注册令牌及其关联的发件人 ID 与应用程序的包名称相关联。
我认为 this topic 上的两个答案都可以回答您的问题。
简而言之:您应该在获取 API 密钥时向 Google 控制台提供应用程序的包名称和发布签名密钥的 SHA-1 签名。其余的通过 Play 服务完成。
当您的应用自行注册以获取其推送通知令牌时,您需要执行如下操作:
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% 确定(因为它是封闭源代码),但 Google 可能会在您注册 GCM 令牌时传递您的应用程序的包名。因此,当您收到推送通知时,Google GCM 服务器可以简单地将包名称与通知本身一起发送。然后,您设备上的 Google Play 服务应用程序将收到此通知并将其路由到您设备上的正确应用程序。
由于 InstanceID 机制,这可能不会全部明确发生,但最终会发生这种情况。
我很难理解关于 <intent-filter>
如何处理 BroadCastReceiver 的基本概念。使用下面的代码我设置了一个 WakeFullBroadCastReciever 来处理任何下游 messages.My 代码运行良好,我是能够接收来自 GCM 的消息,但从概念上讲,<receiver>
如何能够识别哪个应用程序 open.No 在流程图中的哪个位置 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>
这是一个闭源实现,所以我不能确定,但我假设您在服务器端使用的注册令牌包含 Google 的系统制作联系。换句话说,是云中的 GCM 服务或 phone 上的 Play 服务客户端将注册令牌及其关联的发件人 ID 与应用程序的包名称相关联。
我认为 this topic 上的两个答案都可以回答您的问题。
简而言之:您应该在获取 API 密钥时向 Google 控制台提供应用程序的包名称和发布签名密钥的 SHA-1 签名。其余的通过 Play 服务完成。
当您的应用自行注册以获取其推送通知令牌时,您需要执行如下操作:
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% 确定(因为它是封闭源代码),但 Google 可能会在您注册 GCM 令牌时传递您的应用程序的包名。因此,当您收到推送通知时,Google GCM 服务器可以简单地将包名称与通知本身一起发送。然后,您设备上的 Google Play 服务应用程序将收到此通知并将其路由到您设备上的正确应用程序。
由于 InstanceID 机制,这可能不会全部明确发生,但最终会发生这种情况。