我正在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应用程序的消息”,这意味着我们可以注册并接收来自其他应用程序的消息。我们可以吗?我们怎么做呢?
最后,我真的不明白它是如何运作的?我的意思是上面的示例代码。
答案 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个实例,在这种情况下,该广告是您应用中的一个,只有那个。