これは、ParseConsoleのインストールページの状況です。
ご覧のとおり、一部のデバイスには「deviceToken」があり、一部のデバイスには「deviceToken」がありません。 すべてのデバイスが機能するためにdeviceTokenを持っている必要があるため、これは良くありません。
これはどのように可能ですか? deviceTokenを持っていないものプッシュ通知を受け取らない!ので、これは深刻な問題です。
私はParse.comのすべての指示に従い、彼らの空白のプロジェクトやWeb上のさまざまな質問の助けを借りても、彼らが言ったようにすべてを実装しました。しかし、何も私の問題を解決せず、今は何もできません。
私が考えることができる唯一のことは、私のアプリケーション(すでにストアにある)が使用する前にGoogleクラウドメッセージングそしてこの新しいアップデートでシステムを変更して使用することにしました- 解析 GCMシステムを完全に削除します。 2つのシステムの間に競合がある可能性がありますか?
これは深刻なバグであり、ユーザーの3/4がプッシュ通知を受け取らないことが想像できるので、これを修正する必要があります。
アプリをダウンロードしてインストールすると、すべて問題なく、deviceTokenは問題ありません。デバイスにGCMのバージョンがすでに存在するためにアプリを更新する場合:
DeviceTokenを持たないデバイスについては、deviceTokenを手動で挿入する、アプリケーションをアンインストールして再インストールする、Parseの特定の行を削除するなど、さまざまなことを試しました。しかし、何も問題はありません...まだこの問題に直面しています。
マイコード
Application.Java
public class Application extends Android.app.Application {
public Application() {
}
@Override
public void onCreate() {
super.onCreate();
// Initialize the Parse SDK.
Parse.initialize(this, "x", "x");
// Specify an Activity to handle all pushes by default.
PushService.setDefaultPushCallback(this, MainActivity.class);
}
}
MainActivity.Java mainActivityで、deviceToken(私の場合はinstallationId)をuserAgentに連結するだけです。これは正常に機能します。常にinstallationIdを問題なく使用できます。そして、これは私がMainActivityで行っている唯一のことです(他に何かする必要がありますか?saveInBackground、コールバックなど?)
deviceToken = ParseInstallation.getCurrentInstallation().getInstallationId();
webSettings.setUserAgentString(userAgent + " ||" + deviceToken);
AndroidManifest.xml
<!-- Gestione del guasto-->
<uses-permission Android:name="Android.permission.CAMERA" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
<!-- Utilizzo di internet -->
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<!-- Permesso di vibrare per le Push notifications -->
<uses-permission Android:name="Android.permission.VIBRATE" />
<uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
<!-- Mantiene attivo il processore così da poter ricevere in qualsiasi momento le notifiche -->
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<!-- Consente di impostare l'allarme per l'aggiornamento automatico -->
<uses-permission Android:name="com.Android.alarm.permission.SET_ALARM"/>
<permission Android:name="com.hoxell.hoxellbrowser.permission.C2D_MESSAGE"
Android:protectionLevel="signature" />
<uses-permission Android:name="com.hoxell.hoxellbrowser.permission.C2D_MESSAGE" />
<uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" />
<application
Android:name="com.hoxell.hoxellbrowser.Application"
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher_hoxell"
Android:label="@string/app_name"
Android:theme="@style/AppTheme"
>
<!-- Richiesto per le applicazioni che usano Google Play Services -->
<meta-data Android:name="com.google.Android.gms.version" Android:value="@integer/google_play_services_version" />
<activity
Android:name=".MainActivity"
Android:label="@string/app_name"
Android:configChanges="keyboardHidden|orientation|screenSize"
Android:windowSoftInputMode="adjustResize"
Android:launchMode="singleTask">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
Android:name=".SettingsActivity"></activity>
<receiver Android:name=".AlarmReceiver"/>
<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.hoxell.hoxellbrowser.Receiver"
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="com.hoxell.hoxellbrowser" />
</intent-filter>
</receiver>
</application>
Build.gradle
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// You must install or update the Support Repository through the SDK manager to use this dependency.
compile 'com.Android.support:support-v4:20.+' //support
compile "com.google.Android.gms:play-services:5.0.+" //play services
compile 'com.parse.bolts:bolts-Android:1.+'
compile fileTree(dir: 'libs', include: 'Parse-*.jar')
}
私は他に何をすべきか本当にわかりません、それで誰かがこれで私を助けてくれることを願っています。
ありがとうございます。
タブレットで同時に2つのユーザープロファイルを使用していますか?私はまったく同じ問題を抱えており、私の経験から、プロファイル間に競合があります。実際、私の状況では、1つのデバイスが2行をParseデータベースに登録していました。 1つはdeviceTokenを持ち、もう1つは「未定義」のdeviceTokenを持ちます。
残念ながら、私はこの問題を解決したことがありません。これはParseのバグだと思います。
さらにデバッグするために、解析ログを詳細に設定すると便利な場合があります。
Parse.setLogLevel(Parse.LOG_LEVEL_VERBOSE);
それで、マニフェストで間違った「sender_id」を使用していることに気づきました。
<meta-data Android:name="com.parse.Push.gcm_sender_id"
Android:value="id:123456789"/>
これは正確な解決策ではないかもしれませんが、LOG_LEVEL_VERBOSEはこれをデバッグするのに役立つ可能性があります。
最近何が起こっているのか気付くまで、私は長い間この問題に苦しんでいました。パッケージ名が一致する必要があるだけでなく、宣言にビルドフレーバーを含める必要もあります。
解析チュートリアルに従い、com.parse.starterをパッケージ名に置き換えた場合、ビルドフレーバーがない場合は完了ですが、ビルドフレーバーがある場合は、そのように含める必要があります。
com.packagename.build_flavor {デバッグ、リリースなど}
一部のインストールでは、deviceToken
列にGCM登録IDが設定されています。これは、設定が正しいことを示す良い指標です。インストールでGCM登録IDが不足している可能性は間違いありません。
最初の2つのシナリオでは、これは期待どおりに機能しており、一般的に心配する必要はありません。
Tghisが誰かを助けるかどうかはわかりませんが、解析のインストールを含むアプリケーションクラスからこの行を削除した後、デバイストークンと通知を正しく取得できました。これがコードです。コメント行(削除された行)により、すべてが正しく機能しました。なぜこれが機能するのか誰かが説明できますか?
package com.test.Android.Push;
import Android.app.Application;
import com.parse.Parse;
import com.parse.ParseInstallation;
import com.parse.ParsePush;
public class FarrApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Parse.initialize(this, "xxxx", "xxxx");
ParseInstallation.getCurrentInstallation().saveInBackground();
ParsePush.subscribeInBackground("---"); // REMOVED AND WORKS
私はこの問題を抱えていましたが、phonegap-parse-pluginを使用するcordovaアプリで。プラグインのAndroid Javaコードを編集して修正する必要があったので、事実上同じです。
InitializeとsetDefaultPushCallbackの間にこの保存を追加してみてください。
ParseInstallation.getCurrentInstallation().save();
動作するには、それらの間にある必要があります。
クラスを作成し、Application
を拡張してアプリを初期化できます。 ParsePush
とupdateParseInstallation
を初期化するようなもの。
サンプルコード:
public class YourappApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Parse.initialize(this,YOU_PARSE_applicationId, YOU_PARSE_clientKey);
ParseInstallation.getCurrentInstallation().saveInBackground();
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);
}
}
});
}
public static void updateParseInstallation(ParseUser user) {
ParseInstallation installation = ParseInstallation.getCurrentInstallation();
installation.put("userId", user.getObjectId());
installation.saveInBackground();
}
}
そして、LoginActivityで:updateParseInstallation
ParseUser.logInInBackground(username, password, new LogInCallback() {
@Override
public void done(ParseUser parseUser, ParseException e) {
setProgressBarIndeterminateVisibility(false);
if(e == null){
YourappApplication.updateParseInstallation(parseUser);
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
}
});
それらのシミュレーターユーザーですか?私の経験から、シミュレーターでインストールを実行している場合、デバイストークンは自動セットアップされません。
私の問題は、マニフェストでこの許可が欠落していることでした。
<uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" />
また、<service Android:name="com.parse.PushService" />
の直前にメタデータを追加する必要がありました。
<meta-data
Android:name="com.parse.APPLICATION_ID"
Android:value="YourParseApplicationID" />
<meta-data
Android:name="com.parse.CLIENT_KEY"
Android:value="YourParseClientKey" />
次に、deviceTokenを取得できるかどうかを確認します。また、すべて問題がない場合は、解析でアプリのダッシュボードを確認してください。
モジュールの名前を変更した後、同様の問題が発生しました。
「プロジェクトのクリーンアップ」に続いて「プロジェクトの再構築」を試してください