无法使用 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 中接收推送通知的主要内容,如果未能解决你的问题,请参考以下文章
Parse.com 在 Xamarin 中推送 Android