android - 重新打包 list 后 GCM 注册失败

标签 android build android-manifest google-cloud-messaging aapt

我正在尝试创建我的应用程序的自定义构建,我可以将其与我的生产应用程序并行安装。

我已经按照 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 服务。如果您使用的服务类扩展了 GCMBaseIntentServiceGCMBroadCastReceiver 会在应用的主包中查找此类,因此在您的暂存版本中,它具有不同的包名称,它不会找到它。

这种情况下的解决方案是使用 GCMBroadCastReceiver 的子类并重写指定服务类路径的方法。

我的回答here与您的问题有关。

关于android - 重新打包 list 后 GCM 注册失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17371809/

相关文章:

android - 上下文在另一个 Activity 的 fragment 中不可用

android - 省电模式没有在 Android Studio 上禁用

android - 应用程序图标丢失 Android

java - 首次在 Android 应用程序中显示条款和条件

android - Android Java 应用程序中的实例计数违规

安卓旋转动画

Android Smack MessageEventListener

android - 为特定口味禁用 R8

node.js - 如何设置包含多个应用程序的 Dojo 构建流程?

build - Dart:执行 “pub get”和 “pub build”时出错