我正在尝试创建我的应用程序的自定义构建,我可以将其与我的生产应用程序并行安装。
我已经按照 this answer 使用 AAPT 重新打包 list ,成功获得了可以并行安装的自定义暂存版本。 。我的问题是如何让 GCM 适用于这两个应用程序。
我调用GCMRegistrar.register
,但我似乎从未得到对应用程序的暂存版本的响应(GCM 通知对于应用程序的生产版本仍然可以正常工作)。
我在 Google Play 开发者帐户中创建了一个新的草稿应用(我想测试应用内结算,因此需要将该应用作为草稿托管在 Google Play 中),并在我的 Google API 控制台中创建了一个新项目暂存应用程序。
我尝试使用的域如下所示:
- 生产 = com.mydomain.myapp
- 暂存 = com.mydomain.myapp.staging
我遇到的第一个问题是 AAPT 不会更改 GCM 权限,因此 GCM 会失败:
Application does not define permission com.mydomain.myapp.staging.permission.C2D_MESSAGE
所以我添加了一个自定义构建步骤来进一步更新我的 AndroidManifest.xml。现在是相关部分:
<manifest
...
package="com.mydomain.myapp">
<permission
android:name="com.mydomain.myapp.staging.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.mydomain.myapp.staging.permission.C2D_MESSAGE" />
<permission
android:name="com.mydomain.myapp.staging.MESSAGING_PERMISSION"
android:label="Blah"
android:protectionLevel="normal" >
</permission>
<receiver
android:name="com.google.android.gcm.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.mydomain.myapp" />
</intent-filter>
</receiver>
<permission>
标签似乎需要新的包名称以避免我上面提到的错误。
主<manifest>
tag需要保留原来的包名,否则app崩溃。这是因为重新打包似乎是在安装时动态发生的(即,如果您在重新打包后反编译应用程序,您将看到此包名称未更改),因此您不应更改包名称的此实例。
我不确定最后是否是<receiver>
应该是原始名称或重新打包的名称,但我都尝试过,但似乎都不起作用。
这里是来自 Google API 控制台的 API 访问信息:
STAGING
Key for Android apps (with certificates)
API key: <key>
Android apps: <SHA1>;com.mydomain.myapp.staging
PRODUCTION
Key for Android apps (with certificates)
API key: <key>
Android apps: <SHA1>;com.mydomain
两者都有一个“浏览器应用程序 key (带有引用者)”。
我不确定“Android 应用程序 key ”是否确实需要,但是the GCM docs让它有点难以弄清楚。
有人有什么想法吗?我想知道是否是“Android 应用程序的 key ”导致了问题,或者可能是我的临时应用程序是生产应用程序的子域。
另一个复杂的问题是 Google API 控制台的更改需要多长时间才能传播 - 有人知道我需要等待多长时间才能重新测试以确保更改到位吗?
最佳答案
我不确定 AAPT
是如何工作的,但我知道应如何为 GCM 定义 list 。
下面标记有 PACKAGE
的所有位置都应包含相同的包名称。
<manifest
...
package="PACKAGE">
<permission
android:name="PACKAGE.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="PACKAGE.permission.C2D_MESSAGE" />
<receiver
android:name="com.google.android.gcm.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="PACKAGE" />
</intent-filter>
</receiver>
另一个问题可能是您的 Intent 服务。如果您使用的服务类扩展了 GCMBaseIntentService
,GCMBroadCastReceiver
会在应用的主包中查找此类,因此在您的暂存版本中,它具有不同的包名称,它不会找到它。
这种情况下的解决方案是使用 GCMBroadCastReceiver
的子类并重写指定服务类路径的方法。
我的回答here与您的问题有关。
关于android - 重新打包 list 后 GCM 注册失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17371809/