Android 重新打包清单后GCM注册失败
我正在尝试创建我的应用程序的自定义版本,可以与我的生产应用程序同时安装 通过按照使用AAPT重新打包清单,我已经成功地获得了要并行安装的自定义暂存版本。我的问题是让GCM为这两个应用程序工作 我调用了Android 重新打包清单后GCM注册失败,android,build,android-manifest,google-cloud-messaging,aapt,Android,Build,Android Manifest,Google Cloud Messaging,Aapt,我正在尝试创建我的应用程序的自定义版本,可以与我的生产应用程序同时安装 通过按照使用AAPT重新打包清单,我已经成功地获得了要并行安装的自定义暂存版本。我的问题是让GCM为这两个应用程序工作 我调用了gcmregistar.register,但我似乎从未收到对该应用程序登台版本的响应(GCM通知对于该应用程序的生产版本仍然可以正常工作) 我已经在我的Google Play开发者帐户中创建了一个新的草稿应用程序(我想测试应用内计费,因此需要在Google Play中将该应用作为草稿托管),并在我的
gcmregistar.register
,但我似乎从未收到对该应用程序登台版本的响应(GCM通知对于该应用程序的生产版本仍然可以正常工作)
我已经在我的Google Play开发者帐户中创建了一个新的草稿应用程序(我想测试应用内计费,因此需要在Google Play中将该应用作为草稿托管),并在我的Google API控制台中为临时应用程序创建了一个新项目
我尝试使用的域如下所示:
- production=com.mydomain.myapp
- staging=com.mydomain.myapp.staging
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>
让它变得有点难弄明白
有人有什么想法吗?我想知道是“Android应用程序的密钥”导致了这个问题,还是我的登台应用程序是生产应用程序的子域
另一个复杂问题是从Google API控制台传播更改需要多长时间——有人知道我需要等待多长时间才能重新测试以确保更改到位吗?我不知道AAPT
如何工作,但我知道应该如何为GCM定义清单
下面标有包装
的所有位置应包含相同的包装名称
<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>
与您的问题有关。感谢@Eran的回答!为了帮助其他人,我在下面列出了我的工作配置(在运行自定义构建步骤之后)
标记中的包名称仍然需要保留原始包名称,但所有其他实例都需要使用重新打包的名称
AndroidManifest.xml:
<manifest
...
package="ORIGINAL_PACKAGE_NAME">
<permission
android:name="NEW_PACKAGE_NAME.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="NEW_PACKAGE_NAME.permission.C2D_MESSAGE" />
<permission
android:name="NEW_PACKAGE_NAME.MESSAGING_PERMISSION"
android:label="Blah"
android:protectionLevel="normal" >
</permission>
<service android:name=".MyGCMIntentService" />
<receiver
android:name=".MyGCMBroadcastReceiver"
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="NEW_PACKAGE_NAME" />
</intent-filter>
</receiver>
感谢Eran-创建GCMBroadCastReceiver的子类修复了这个问题!我已经在一个单独的答案中发布了我的配置,因为如果使用AAPT重新打包,清单最终看起来会略有不同。
<manifest
...
package="ORIGINAL_PACKAGE_NAME">
<permission
android:name="NEW_PACKAGE_NAME.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="NEW_PACKAGE_NAME.permission.C2D_MESSAGE" />
<permission
android:name="NEW_PACKAGE_NAME.MESSAGING_PERMISSION"
android:label="Blah"
android:protectionLevel="normal" >
</permission>
<service android:name=".MyGCMIntentService" />
<receiver
android:name=".MyGCMBroadcastReceiver"
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="NEW_PACKAGE_NAME" />
</intent-filter>
</receiver>
public class MyGCMBroadcastReceiver extends GCMBroadcastReceiver {
public MyGCMBroadcastReceiver() {
super();
Log.d("Creating MyGCMBroadcastReceiver");
}
@Override
protected String getGCMIntentServiceClassName(Context context) {
String className = MyGCMIntentService.class.getName();
Log.i("getGCMIntentServiceClassName", className);
return className;
}
}