java - 应用关闭后未收到推送

标签 java android parse-platform push-notification

在将其标记为重复之前:

我至少阅读了 15 个类似的线程,每个线程要么使用旧的 Parse 代码(现已弃用的 setDefaultPushCallback),要么问题是在 Activity 中调用 Parse.initialize(...) 的结果,并且不在应用程序类中。但这适用于我的情况。官方示例(我正在使用)显然是正确的,因此代码已经在 Application 类中。

我已经下载了 Push Starter example from Parse's official guides并在模拟器上试用。我仅在应用程序运行时收到推送。在它关闭的那一刻(从“最近的应用程序”列表中删除,而不是强制终止),我不再收到推送。这使得整个功能相当无用......我尝试使用和不使用 GCM,行为是相同的。

有什么可能出错的线索吗?所有类都是常用示例类,我没有覆盖或添加任何内容(除了我从指南中复制的 id/key 和 ParsePush.subscribeInBackground 调用)。奇怪的是,示例代码不包含 ParsePush.subscribeInBackground 和 QuickStart没有提到它。它甚至提供了一个测试按钮,据称可以发送一个我从未收到过的推送,无论有没有 subscribeInBackground。到目前为止,我能够获得推送的唯一方法是使用 subscribeInBackground 并通过 Web 控制台手动发送推送,并且只有在应用程序正在运行时才会这样。 Web 控制台还不断提示有 2 个已注册设备……这是不正确的。

list :

<?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>

解析应用:

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);
                }
            }
        });
    }
}

最佳答案

只是为了澄清为什么您会看到这种行为,Parse 有两种不同的方式来传递推送通知:

  1. “解析方式”:Parse SDK 有一个组件在您的应用程序中运行,它与 Parse 后端服务器保持连接。这只会在您的应用实际运行时起作用,因为终止它会断开与 Parse 后端的连接。
  2. GCM“Google”推送通知:这通过 Google Play 服务工作,该应用程序始终在后台运行,可以在需要时启动您的应用程序。这将始终有效,除非您强行停止该应用程序。

在您的情况下,存在包名冲突:com.parse.starter 是示例中实际包含的包名。这会导致 GCM 无法工作,因为它已经知 Prop 有不同签名的包。将您的包名称更改为独特的名称,例如 com.parse.kaqqao 应该可以解决这个问题。

关于java - 应用关闭后未收到推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28396375/

相关文章:

java - 除了MVP和MVC还有其他模式吗?

android - 解析异常 : Connection to https://api. parse.com 被拒绝

ios - 在 Swift 中子类化 PFObject

java - netty channel.iswritable() 返回 false,当并发级别高时

java - onJoin 事件不取代lastPlayer

android - FindViewById 在子类中使用时为空

从 ADB 设备命令看不到通过 USB 在 eclipse 上连接 android mini pc

javascript - docker 容器上解析服务器的自定义身份验证 (OAuth2)

java - 为什么 "synchronized"对多态没有作用

java - 如何使用 java servlet 从 mysql 数据库中检索图像并将其显示在 HTML img 标签中?