Android GCM:从其他应用

时间:2015-12-02 03:33:08

标签: android google-cloud-messaging

我正在https://developers.google.com/cloud-messaging/android/client

阅读Android GCM的Android文档

然后我注意到下面的部分:

  

你的+“。permission.C2D_MESSAGE”权限   防止其他Android应用程序注册和接收   Android应用程序的消息。权限名称必须完全正确   匹配此模式 - 否则Android应用程序将无法接收   消息。

示例代码:

<permission android:name="<your-package-name>.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="<your-package-name>.permission.C2D_MESSAGE" />

上面的代码,它似乎声明了一个自定义permision然后使用它。正确?

现在我有两个问题:

  • 首先,正如文档中提到的“防止其他Android应用程序注册和接收Android应用程序的消息”,这意味着我们可以注册并接收来自其他应用程序的消息。我们可以吗?我们怎么做呢?

  • 最后,我真的不明白它是如何运作的?我的意思是上面的示例代码。

你可以帮忙吗?? (啊,我在这里看到了一个完全相同的问题How does android permission.C2D_MESSAGE work to prevent other people mimic my client - 但它是1年前的问题,直到现在都没有更新,所以希望我们有一些更新)

1 个答案:

答案 0 :(得分:1)

这个答案是一个有根据的猜测。我认为权威的答案只能来自谷歌内部人员才能访问代码。

GCM客户端应用必须声明的com.your.pkg.permission.C2D_MESSAGE的一个重要方面是其保护级别为Signature。 The documentation解释了签名级别权​​限是:

  

系统仅在请求的应用程序授予的权限   使用与声明的应用程序相同的证书进行签名   许可。

这意味着系统永远不会将您声明的C2D_MESSAGE权限授予任何未经您签名的应用。

当GCM框架收到下游消息时,它知道应该传递消息的应用程序的包名。我不知道框架是如何获得这些信息的。也许它包含在消息的元数据中。在Google Developers Console中为GCM客户端应用创建凭据时,您需要提供包名称。结果是(API密钥,发件人ID,包名称和SHA-1指纹)的关联。 GCM服务器使用该数据在消息元数据中包含目标包名称是合理的。

使用包名称,GCM框架可以创建完整的C2D_MESSAGE权限字符串,并使用包含权限的Context.sendBroadcast()方法。然后,广播将仅传送到拥有该权限的GcmReceiver个实例,在这种情况下,该广告是您应用中的一个,只有那个。