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

Posted

技术标签:

【中文标题】无法使用 Parse 在 Android 中接收推送通知【英文标题】:Unable to receive push notification in Android using Parse 【发布时间】:2016-05-12 08:55:27 【问题描述】:

在 Parse 控制台中,它显示交付报告为成功,但根本没有调用 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();
    





【问题讨论】:

您的 google-services.json 中可能有问题 解析已关闭。你应该转移到另一个服务。 @DevendraSingh 是的,我知道,这只是几个月的临时解决方案。 看link第二步 google-services.json 文件看起来不错。 【参考方案1】:

添加权限:

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

【讨论】:

【参考方案2】:

除了权限

有几件事会导致 Parse 无法正确发送推送通知。 Parse 在详细说明它们方面做得并不好,但根据我使用 Parse 的经验,我可以尝试阐明一些并不总是那么明显的事情。

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

确保 deviceToken 正在注册 除了简单地初始化 Parse,确保您的应用程序包名称与您在 Android 清单中用于链接的名称匹配。如果不是这样,那肯定是没有收到推送的原因。

初始化解析

    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】:

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

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

只是一些建议,继续使用诸如 Firebase 之类的东西。 Parse 正在关闭。

【讨论】:

【参考方案4】:

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

<!-- 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.+'

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

【讨论】:

错字:员工 --> 东西【参考方案5】:

使用设备令牌检查您的安装对象。 (也许你应该设置 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

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

【讨论】:

我在发布问题之前添加了这些权限。没用。 你有deviceToken,必须保存在DB中吗?【参考方案6】:

Parse 将完全停用。

我收到来自 parse 的邮件,说他们要退休了。那么你为什么要犯那些即将过期的错误。尝试使用 gsm 或更轻的套接字。

【讨论】:

以上是关于无法使用 Parse 在 Android 中接收推送通知的主要内容,如果未能解决你的问题,请参考以下文章

无法从 android 上的解析推送通知接收额外数据

Parse.com 在 Xamarin 中推送 Android

android 使用 parse.com api 通过推送通知实现聊天

在 Android 上解析接收通知

无法使用 parse.com 控制台发送/接收推送通知

ANDROID:电子邮件客户端接收器电子邮件 ID 在 android-parse 中为空