无法使用Parse在Android中接收推送通知

时间:2016-05-12 08:55:28

标签: android parse-platform push-notification

在Parse控制台中,它显示Delivery报告成功,但onPushReceive根本没有被调用。我在这里错过了什么?任何帮助,将不胜感激。

以下是我的代码。 清单代码:

    <receiver
        android:name="com.google.android.gms.gcm.GcmReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.appname" />
        </intent-filter>
    </receiver>

    <service android:name="com.parse.PushService" />

    <receiver android:name="com.appname.PushReceiver"
        android:permission="com.google.android.c2dm.permission.SEND"
        android:exported="false">
        <intent-filter>
            <action android:name="com.parse.push.intent.RECEIVE" />
            <action android:name="com.parse.push.intent.OPEN" />
            <action android:name="com.parse.push.intent.DELETE" />
        </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.appname" />
        </intent-filter>
    </receiver>

PushReceiver类:

public class PushReceiver extends ParsePushBroadcastReceiver
{

@Override
protected void onPushReceive(Context context, Intent intent) {
    super.onPushReceive(context, intent);

    Log.v("Push Receive called...", "");


    if (intent == null)
        return;

    try
    {
        JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data"));



    } catch (JSONException e) {
        e.printStackTrace();
    }
}



}

6 个答案:

答案 0 :(得分:2)

添加权限:

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>

检查接收器:

<receiver android:name="com.appname.PushReceiver" android:exported="false">
    <intent-filter>
        <action android:name="com.appname.INTERCEPT"/>
    </intent-filter>
</receiver>

答案 1 :(得分:2)

以下是您在清单中应具有的权限:

<!-- Push Permissions -->
    <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="your_package_name.permission.C2D_MESSAGE" />
    <uses-permission android:name="your_package_name.permission.C2D_MESSAGE" />

以下是您应该在清单中定义的其他内容:

<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="your_package_name" />
            </intent-filter>
        </receiver>

Gradle依赖项:

compile 'com.parse.bolts:bolts-android:1.+'
compile 'com.parse:parse-android:1.+'

使用此清单配置,我可以成功接收来自解析的推送。

答案 2 :(得分:2)

除了权限

有一些因素会导致Parse无法正确发送推送通知。 Parse在详细介绍它们方面做得不是很好,但是根据我对Parse的经验,我可以尝试对那些并不总是那么明显的事情有所了解。

如果您正在检查Parse仪表板并且能够看到您的设备注册,那就很好。 但是,您需要确保为该设备注册了deviceToken。如果没有,我几乎可以保证,如果你检查推送标签,你会发现推送的成功率是0%或不成功。

确保deviceToken正在注册 除了简单地初始化Parse之外,确保您的应用的软件包名称与您在Android Manifest中用来链接的名称相匹配。如果情况并非如此,那肯定是不接受推动的原因。

初始化解析

    private void initializeParse() {
         Parse.enableLocalDatastore(this);
         Parse.initialize(this);
         ParseInstallation.getCurrentInstallation().saveInBackground();
         Log.d(LOG_TAG, "Initializing parse with app id: " + getString(R.string.parse_app_id) + " client_key: " + getString(R.string.parse_client_key));
}

倾听

public class ParsePluginReceiver extends ParsePushBroadcastReceiver {
private static final String TAG = "ParsePluginReceiver";
private static final String RECEIVED_IN_FOREGROUND = "receivedInForeground";
private static int badgeCount = 0;
public static final String FORWARD_EXTRA = "FORWARD_ACTIVITY";


@Override
protected void onPushReceive(Context context, Intent intent) {
    JSONObject pushData = getPushData(intent);

    if (pushData != null) {
        Log.d(TAG, "JSON Payload: " + pushData.toString());
        super.onPushReceive(context, intent);
    }
}

protected void onPushOpen(Context context, Intent intent) {
    JSONObject pushData = getPushData(intent);
    Log.d(TAG, "JSON Payload: " + pushData.toString());

    if (pushData != null) {
        try {
            super.onPushOpen(context, intent);
        } catch (Exception ex) {

        }
    }
 }

作为参考,Parse Sdk位于此处:https://parse.com/docs/android/guide

旁注 Parse将于明年初被弃用。

答案 3 :(得分:2)

确保您拥有所有这些权限:

   <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="your_package_name.permission.C2D_MESSAGE" />
    <uses-permission android:name="your_package_name.permission.C2D_MESSAGE" />

你需要将所有这些添加到你的Manifest中:

<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="your_package_name" />
        </intent-filter>
    </receiver>

只是一些建议,转到Firebase这样的东西。 Parse正在关闭。

答案 4 :(得分:1)

使用device-token检查安装对象。 (也许你应该设置senderID)

下面的

似乎已被弃用。我现在无法从解析文档中找到任何位置。 尝试添加以下权限

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission
        android:name="com.appname.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
<uses-permission android:name="com.appname.permission.C2D_MESSAGE" />

这些是旧sdk版本所需的权限(可能早于1.10)。

==============新部分====

我在github上找到了推送示例代码。 https://github.com/ParsePlatform/PushTutorial/tree/master/Android

以下是使用1.11.0 sdk的项目(1.13.0也可以使用)。 https://dl.dropboxusercontent.com/u/82261293/Appname.zip

根据我的经验,有些设备有机会没有设备令牌。您应该检查它是否已保存。

答案 5 :(得分:-1)

  

Parse将完全退役。

我从解析邮件中得知他们将退休。那你为什么要做那些即将到期的错误呢?尝试使用更轻的gsm或socket。