【问题标题】:Unable to receive push notification in Android using Parse无法使用 Parse 在 Android 中接收推送通知
【发布时间】: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 文件看起来不错。

标签: android parse-platform push-notification


【解决方案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 或更轻的套接字。

        【讨论】:

          猜你喜欢
          • 2023-03-11
          • 2018-08-24
          • 2012-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多