解析 android 个标记为已发送但未在设备上显示的推送通知

Parse android push notifications marked as sent, but not seen on device

编辑:已解决!问题是我是 运行 模拟器中的应用程序,没有生成解析 deviceToken。我 运行 它在实际设备上,现在我收到了通知!

我一直在尝试让 Parse 推送通知在 android 上运行。 在 Parse.com 仪表板上,我看到我的应用程序已注册并连接到 Parse,但是当我发送推送通知时,Parse 说它已发送,但它没有显示在 device/emulator.

主要活动:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XXXXX.XXXXX.XXXXX.XXXXX">


<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.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:protectionLevel="signature"
    android:name="${applicationId}.permission.C2D_MESSAGE" />
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
<application
    android:name=".News"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <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.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" />
            <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>
    <meta-data android:name="com.parse.push.notification_icon"
        android:resource="@mipmap/ic_launcher"/>
</application>

</manifest>

新 class: "News"

package XXXX.XXXX.XXXX.XXXX;

import android.app.Application;

import com.parse.Parse;
import com.parse.ParseInstallation;

public class News extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        Parse.initialize(this, "XXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX");
        ParseInstallation.getCurrentInstallation().saveInBackground();

        ParsePush.subscribeInBackground("---");
    }
}

我是 Parse 的新手,我已经尝试了很多我在网上看到的东西(如果我的代码一团糟,我深表歉意),但我似乎无法找到解决方案.

如有任何帮助,我们将不胜感激, 谢谢。

(我看到有人把 Parse 的东西放在不同的地方 class,我自己也试过,但我真的不明白该做什么或它是如何工作的)

最好在 Application subclass 中初始化 Parse,而不是 Activity.

例如,当收到推送时,您的 BroadcastReceiver 将被激活,这反过来又会首先触发 Application 到 运行。这将根据需要初始化 Parse。

请记住,您还需要订阅正确的频道才能接收任何内容。

所以这是一个示例应用程序 class:

public class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        Parse.initialize(this, "XXXXXXXXX", "XXXXXXXXX");
        ParseInstallation.getCurrentInstallation().saveInBackground();

        ParsePush.subscribeInBackground("<Channel Name>");
    }
}

需要在您的清单中声明:

<application
    android:name=".MyApp">
... etc ...
</application>

如果您使用 Gradle 构建(或 Android Studio),那么有一个有用的快捷方式可确保正确声明您的解析推送权限和接收者。

在您的清单中,使用 ${applicationId} 关键字声明您的权限:

<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />

你的广播接收器是这样的:

<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" />

        <category android:name="${applicationId}" />
    </intent-filter>
</receiver>

Gradle 会在构建应用程序之前自动将 ${applicationId} 扩展为正确的字符串。

当您开始构建不同的应用程序风格时,这变得至关重要,因为您随后需要处理不同的应用程序 ID。