关闭应用后,推送未收到

时间:2015-02-08 16:29:40

标签: java android parse-platform push-notification

在将此标记为重复之前:

我已经阅读了至少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);
                }
            }
        });
    }
}

2 个答案:

答案 0 :(得分:1)

为了澄清您看到这种行为的原因,Parse有两种不同的方式来传递推送通知:

  1. &#34;解析方式&#34;:Parse SDK在您的应用程序中运行一个组件,该组件与Parse后端服务器保持连接。这仅适用于您的应用实际运行时,因为终止它会破坏与Parse后端的连接。
  2. GCM&#34; Google&#34;推送通知:此功能通过Google Play服务运行,该应用始终在后台运行,可在需要时启动您的应用。这将始终有效,除非您强行停止该应用程序。
  3. 在您的情况下,您存在程序包名称冲突:com.parse.starter是示例中实际包含的程序包名称。这会导致GCM无法工作,因为它已经知道不同签名下的包。将包名更改为com.parse.kaqqao之类的独特内容应该可以解决问题。

答案 1 :(得分: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权限。

  2. 尝试更改清单中两个广播接收器标签的顺序。 (在ParsePushBroadcastReceiver之前保留GCMBroadcastReceiver)

  3. 可能是由于android:exported =&#34; false&#34;,可能会阻止Receiver收听服务器发送的推送消息。尝试更改为true。