在将此标记为重复之前:
我已经阅读了至少15个类似的线程,每个线程都使用旧的Parse代码(现已弃用的setDefaultPushCallback),或者问题是在一个活动中调用Parse.initialize(...)的结果。不在Application类中。但这不适用于我的情况。官方示例(我正在使用)显然是正确的,因此代码已经在Application类中。
我已下载Push Starter example from Parse's official guides并在模拟器上试用了它。我只在应用程序运行时收到推送。它关闭的那一刻(从“最近的应用程序”列表中删除,而不是强行杀死),我不再受到推动。这使得整个功能相当无用......我尝试使用和不使用GCM,行为是一样的。
任何可能出错的线索?所有类都是库存示例,没有被我覆盖或添加(除了id / key和我从指南中复制的ParsePush.subscribeInBackground调用)。奇怪的是,示例代码不包含ParsePush.subscribeInBackground,QuickStart没有提到它。它甚至提供了一个测试按钮,该按钮可以发送一个我从未收到过的推送,无论是否有subscribeInBackground。到目前为止,我能够获得推送的唯一方法是使用subscribeInBackground并通过Web控制台手动发送推送,并且只有在应用程序运行时才这样做。网络控制台还不断告诉我有2个已注册的设备......这是不真实的。
清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.parse.starter"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="21"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!--
IMPORTANT: Change "com.parse.starter.permission.C2D_MESSAGE" in the lines below
to match your app's package name + ".permission.C2D_MESSAGE".
-->
<permission android:protectionLevel="signature"
android:name="com.parse.starter.permission.C2D_MESSAGE" />
<uses-permission android:name="com.parse.starter.permission.C2D_MESSAGE" />
<application
android:name=".ParseApplication"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:allowBackup="true">
<activity
android:name=".ParseStarterProjectActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.parse.PushService" />
<receiver android:name="com.parse.ParseBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
<receiver android:name="com.parse.ParsePushBroadcastReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.parse.push.intent.RECEIVE" />
<action android:name="com.parse.push.intent.DELETE" />
<action android:name="com.parse.push.intent.OPEN" />
</intent-filter>
</receiver>
<receiver android:name="com.parse.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" />
<!--
IMPORTANT: Change "com.parse.starter" to match your app's package name.
-->
<category android:name="com.parse.starter" />
</intent-filter>
</receiver>
</application>
</manifest>
ParseApplication:
package com.parse.starter;
...
public class ParseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Initialize Crash Reporting.
ParseCrashReporting.enable(this);
// Enable Local Datastore.
Parse.enableLocalDatastore(this);
ParseUser.enableAutomaticUser();
// Add your initialization code here
Parse.initialize(this, "***", "***");
ParseACL defaultACL = new ParseACL();
// Optionally enable public read access.
// defaultACL.setPublicReadAccess(true);
ParseACL.setDefaultACL(defaultACL, true);
ParsePush.subscribeInBackground("", new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
Log.d("com.parse.push", "successfully subscribed to the broadcast channel.");
} else {
Log.e("com.parse.push", "failed to subscribe for push", e);
}
}
});
}
}
答案 0 :(得分:1)
为了澄清您看到这种行为的原因,Parse有两种不同的方式来传递推送通知:
在您的情况下,您存在程序包名称冲突:com.parse.starter
是示例中实际包含的程序包名称。这会导致GCM无法工作,因为它已经知道不同签名下的包。将包名更改为com.parse.kaqqao
之类的独特内容应该可以解决问题。
答案 1 :(得分:1)
这有几个原因:
有两个BroadcastReceiver即&#34; com.parse.ParsePushBroadcastReceiver&#34;和&#34; com.parse.GcmBroadcastReceiver&#34;。我相信第一个接收器优先于GCMBroadcastReceiver,因此移除或保留此接收器不会影响行为。它也可能是由于动作&#34; com.parse.push.intent.RECEIVE&#34;,它可能正在处理推送消息RECEIVE动作。如果接收者执行解析Push消息的相同任务(在后台启动相同的服务),则将intent-filter包含在一个接收器中,并让它处理所有类型的推送消息。由于GCMBroadcastReceiver拥有C2DM权限。
尝试更改清单中两个广播接收器标签的顺序。 (在ParsePushBroadcastReceiver之前保留GCMBroadcastReceiver)
可能是由于android:exported =&#34; false&#34;,可能会阻止Receiver收听服务器发送的推送消息。尝试更改为true。