web-dev-qa-db-ja.com

解析:プッシュ通知「deviceToken」が未定義

これは、ParseConsoleのインストールページの状況です。

enter image description here

ご覧のとおり、一部のデバイスには「deviceToken」があり、一部のデバイスには「deviceToken」がありません。 すべてのデバイスが機能するためにdeviceTokenを持っている必要があるため、これは良くありません。

これはどのように可能ですか? deviceTokenを持っていないものプッシュ通知を受け取らない!ので、これは深刻な問題です。

私はParse.comのすべての指示に従い、彼らの空白のプロジェクトやWeb上のさまざまな質問の助けを借りても、彼らが言ったようにすべてを実装しました。しかし、何も私の問題を解決せず、今は何もできません。

私が考えることができる唯一のことは、私のアプリケーション(すでにストアにある)が使用する前にGoogleクラウドメッセージングそしてこの新しいアップデートでシステムを変更して使用することにしました- 解析 GCMシステムを完全に削除します。 2つのシステムの間に競合がある可能性がありますか?

これは深刻なバグであり、ユーザーの3/4がプッシュ通知を受け取らないことが想像できるので、これを修正する必要があります。

アプリをダウンロードしてインストールすると、すべて問題なく、deviceTokenは問題ありません。デバイスにGCMのバージョンがすでに存在するためにアプリを更新する場合:

  • 一部のデバイスは問題なくParsegoodに登録されます
  • 一部のデバイスは解析に登録されますがなし deviceToken

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')

}

私は他に何をすべきか本当にわかりません、それで誰かがこれで私を助けてくれることを願っています。

ありがとうございます。

21
ernestocattaneo

タブレットで同時に2つのユーザープロファイルを使用していますか?私はまったく同じ問題を抱えており、私の経験から、プロファイル間に競合があります。実際、私の状況では、1つのデバイスが2行をParseデータベースに登録していました。 1つはdeviceTokenを持ち、もう1つは「未定義」のdeviceTokenを持ちます。

残念ながら、私はこの問題を解決したことがありません。これはParseのバグだと思います。

7
WiTHS4UC3

さらにデバッグするために、解析ログを詳細に設定すると便利な場合があります。

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はこれをデバッグするのに役立つ可能性があります。

2
mogile_oli

最近何が起こっているのか気付くまで、私は長い間この問題に苦しんでいました。パッケージ名が一致する必要があるだけでなく、宣言にビルドフレーバーを含める必要もあります。

解析チュートリアルに従い、com.parse.starterをパッケージ名に置き換えた場合、ビルドフレーバーがない場合は完了ですが、ビルドフレーバーがある場合は、そのように含める必要があります。

com.packagename.build_flavor {デバッグ、リリースなど}

1
Paul Hundal

一部のインストールでは、deviceToken列にGCM登録IDが設定されています。これは、設定が正しいことを示す良い指標です。インストールでGCM登録IDが不足している可能性は間違いありません。

  • デバイスがGoogleサービスフレームワーク(Amazon Kindle Fireなど)にアクセスできない可能性があります。 GCM以外のParsePushレシーバーをセットアップした場合でも、これらのデバイスへのプッシュは配信されます。
  • アプリがデバイスから削除されたため、GCMから登録解除されました。この場合、インストールクラスに任意のデータを保存することが許可されているため、意図しないデータ損失につながる可能性があるため、インストールを自動的に削除しません。
  • デバイスが自身を登録しようとしたときに、Googleサービスフレームワークが利用できなかった可能性があります。

最初の2つのシナリオでは、これは期待どおりに機能しており、一般的に心配する必要はありません。

1
Héctor Ramos

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
0
user3078406

私はこの問題を抱えていましたが、phonegap-parse-pluginを使用するcordovaアプリで。プラグインのAndroid Javaコードを編集して修正する必要があったので、事実上同じです。

InitializeとsetDefaultPushCallbackの間にこの保存を追加してみてください。

ParseInstallation.getCurrentInstallation().save();

動作するには、それらの間にある必要があります。

0
Andy Ballard

クラスを作成し、Applicationを拡張してアプリを初期化できます。 ParsePushupdateParseInstallationを初期化するようなもの。

サンプルコード:

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);
                            }
                       }
          });
0
bjiang

それらのシミュレーターユーザーですか?私の経験から、シミュレーターでインストールを実行している場合、デバイストークンは自動セットアップされません。

0
Drilem

私の問題は、マニフェストでこの許可が欠落していることでした。

<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を取得できるかどうかを確認します。また、すべて問題がない場合は、解析でアプリのダッシュボードを確認してください。

0
L.Kovachev

モジュールの名前を変更した後、同様の問題が発生しました。

「プロジェクトのクリーンアップ」に続いて「プロジェクトの再構築」を試してください

0
Venkat Kotra