解析安装未获取 DeviceToken

Parse Installation not getting DeviceToken

我正尝试在 android 中使用解析推送通知,我在应用程序 class 中注册解析,如下所示:

@Override
public void onCreate() {
    super.onCreate();
    Parse.initialize(this, "***************", "***************");
}

我正在主订阅这样推送activity:

@Override
    protected void onCreate(Bundle savedInstanceState) {

    ParsePush.subscribeInBackground("", new SaveCallback() {
        @Override
        public void done(ParseException e) {
            if (e == null) {

                        ParseInstallation.getCurrentInstallation().saveInBackground(new SaveCallback() {
                            @Override
                            public void done(ParseException e) {


                                if (e == null) {
                                    String deviceToken = (String) ParseInstallation.getCurrentInstallation().get("deviceToken");
                                    Log.e("MainActivity", "device toekn " + deviceToken);

                                } else {
                                    Log.e("MainActivity", "failed to subscribe for push " + e.getLocalizedMessage());
                                }
                            }
                        });

            } else {
                Log.e("MainActivity", "failed to subscribe for push", e);
            }
        }
    });



    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

这是我的清单部分,适用于解析:

  <service android:name="com.parse.PushService" />
    <receiver android:name="com.parse.ParseBroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.USER_PRESENT" />
        </intent-filter>
    </receiver>
    <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" />

            <!--
              IMPORTANT: Change "com.parse.starter" to match your app's package name.
            -->
            <category android:name="com.****" />
        </intent-filter>
    </receiver>

然而,大多数时候设备令牌 returns 为空,并且设备在解析仪表板中没有设备令牌,因此,我的设备没有收到推送通知。

奇怪的是有时它确实有效,我确实获得了 deviceToken 并且安装对象确实获得了推送,有人遇到过这种行为吗?

如果不添加任何东西,为什么要保存安装? ParseSDK 已经为您做到了。

您必须将有效的 "channel" 参数传递给 subscribeInBackground: 这是解析用来推送的通道;没有它,你根本不会得到任何推动。 https://parse.com/docs/android/api/com/parse/ParsePush.html#subscribeInBackground(java.lang.String,%20com.parse.SaveCallback)

此外,请确保您已在清单中添加所需的标记,以便解析推送正常工作 - 所需的标记就像此处解释的那样:

https://parse.com/docs/android/guide#push-notifications-receiving-pushes

我猜你使用的是 1.9.3 版本。在 1.9.4 版本中,他们已经解决了这个问题。检查 release notes

这个问题最终解决了,只是tag中manifest的tag中的Application name有一个简单的错误。 由于我在此处发布的代码是 "com.***" 没有人可以提供帮助,我深表歉意。

我遇到了这个问题,我通过修改我的 AndroidManifest 文件解决了它。

您似乎可以将解析配置为使用“解析推送网络”或GCM(Google 云消息).

Parse 将自己的推送网络用于希望避免依赖 Google Play 商店的应用程序,以及不支持 Play 商店的设备(如 Kindle)。 因此,重要的是要在其他地方设置以下内容以使用 GCM。

<uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.VIBRATE" />
 <uses-permission android:name="android.permission.WAKE_LOCK" />
 <uses-permission android:name="android.permission.GET_ACCOUNTS" />
 <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
 <permission android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE"
   android:protectionLevel="signature" />
 <uses-permission android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE" />

将上面声明中的 YOUR_PACKAGE_NAME 替换为您的应用程序包名称。此外,确保 com.parse.GcmBroadcastReceiver 和 com.parse.PushService 被声明为元素的子元素:

这对我有用,也许对你也有用。

Read this to get a full understanding

将解析日志记录设置为详细有助于进一步调试:

Parse.setLogLevel(Parse.LOG_LEVEL_VERBOSE);

我注意到我在清单中使用了错误的 "sender_id":

<meta-data android:name="com.parse.push.gcm_sender_id"
        android:value="id:123456789"/>

我正在使用我自己的 GCM,您在这里没有这样做...但是 LOG_LEVEL_VERBOSE 可能会帮助其他人调试它。