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 处理应用程序的主要内容,如果未能解决你的问题,请参考以下文章

BroadcastReceive之ip拨号

GCM 如何使用 GCM 和 3rd 方服务器注销设备

如何使用 GCM 通知同步

如何使用 GCM 和 java 向多个设备发送推送通知

(新)GCM 消息收到,但如何解析?

如何使用 GCM 在 Android 中解析或实际获取推送消息