在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();
}
}
}
答案 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。