gpt4 book ai didi

java - 应用关闭后未收到推送

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:15:54 27 4
gpt4 key购买 nike

在将其标记为重复之前:

我至少阅读了 15 个类似的线程,每个线程要么使用旧的 Parse 代码(现已弃用的 setDefaultPushCallback),要么问题是在 Activity 中调用 Parse.initialize(...) 的结果,并且不在应用程序类中。但这适用于我的情况。官方示例(我正在使用)显然是正确的,因此代码已经在 Application 类中。

我已经下载了 Push Starter example from Parse's official guides并在模拟器上试用。我仅在应用程序运行时收到推送。在它关闭的那一刻(从“最近的应用程序”列表中删除,而不是强制终止),我不再收到推送。这使得整个功能相当无用......我尝试使用和不使用 GCM,行为是相同的。

有什么可能出错的线索吗?所有类都是常用示例类,我没有覆盖或添加任何内容(除了我从指南中复制的 id/key 和 ParsePush.subscribeInBackground 调用)。奇怪的是,示例代码不包含 ParsePush.subscribeInBackground 和 QuickStart没有提到它。它甚至提供了一个测试按钮,据称可以发送一个我从未收到过的推送,无论有没有 subscribeInBackground。到目前为止,我能够获得推送的唯一方法是使用 subscribeInBackground 并通过 Web 控制台手动发送推送,并且只有在应用程序正在运行时才会这样。 Web 控制台还不断提示有 2 个已注册设备……这是不正确的。

list :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.parse.starter"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="21"/>

<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.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<!--
IMPORTANT: Change "com.parse.starter.permission.C2D_MESSAGE" in the lines below
to match your app's package name + ".permission.C2D_MESSAGE".
-->
<permission android:protectionLevel="signature"
android:name="com.parse.starter.permission.C2D_MESSAGE" />
<uses-permission android:name="com.parse.starter.permission.C2D_MESSAGE" />

<application
android:name=".ParseApplication"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:allowBackup="true">
<activity
android:name=".ParseStarterProjectActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<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.parse.starter" />
</intent-filter>
</receiver>
</application>

</manifest>

解析应用:

package com.parse.starter;
...

public class ParseApplication extends Application {

@Override
public void onCreate() {
super.onCreate();

// Initialize Crash Reporting.
ParseCrashReporting.enable(this);

// Enable Local Datastore.
Parse.enableLocalDatastore(this);

ParseUser.enableAutomaticUser();

// Add your initialization code here
Parse.initialize(this, "***", "***");

ParseACL defaultACL = new ParseACL();
// Optionally enable public read access.
// defaultACL.setPublicReadAccess(true);
ParseACL.setDefaultACL(defaultACL, true);

ParsePush.subscribeInBackground("", new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
Log.d("com.parse.push", "successfully subscribed to the broadcast channel.");
} else {
Log.e("com.parse.push", "failed to subscribe for push", e);
}
}
});
}
}

最佳答案

只是为了澄清为什么您会看到这种行为,Parse 有两种不同的方式来传递推送通知:

  1. “解析方式”:Parse SDK 有一个组件在您的应用程序中运行,它与 Parse 后端服务器保持连接。这只会在您的应用实际运行时起作用,因为终止它会断开与 Parse 后端的连接。
  2. GCM“Google”推送通知:这通过 Google Play 服务工作,该应用程序始终在后台运行,可以在需要时启动您的应用程序。这将始终有效,除非您强行停止该应用程序。

在您的情况下,存在包名冲突:com.parse.starter 是示例中实际包含的包名。这会导致 GCM 无法工作,因为它已经知 Prop 有不同签名的包。将您的包名称更改为独特的名称,例如 com.parse.kaqqao 应该可以解决这个问题。

关于java - 应用关闭后未收到推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28396375/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com