wake-up-neo.com

PARSE: Push Notifications "deviceToken" undefiniert

Dies ist die Situation auf meiner Installationsseite in Parse Console:

enter image description here

Wie Sie sehen, haben einige Geräte das "deviceToken" und einige nicht das "deviceToken". Dies ist nicht gut, da jedes Gerät das deviceToken haben sollte, damit es funktioniert.

Wie ist das möglich? Dies ist ein ernstes Problem, da diejenigen, die das DeviceToken nicht haben keine Push-Benachrichtigungen erhalten!

Ich habe alle Anweisungen auf Parse.com befolgt und alles wie gesagt implementiert, auch mithilfe ihres leeren Projekts und mithilfe verschiedener Fragen im Web. Aber nichts hat mein Problem behoben und jetzt kann ich nichts mehr tun.

Das Einzige, woran ich denken kann, ist, dass meine Anwendung (die bereits im Store verfügbar ist) verwendet wurde Google Cloud Messaging und mit diesem neuen Update habe ich beschlossen, das System zu ändern und zu verwenden - Parse GCM-System vollständig entfernen. Gibt es vielleicht einen Konflikt zwischen den beiden Systemen?

Ich muss das beheben, da Sie sich vorstellen können, dass dies ein schwerwiegender Fehler ist und jetzt 3/4 meiner Benutzer keine Push-Benachrichtigungen erhalten.

Wenn Sie die App herunterladen und installieren: Alles ist in Ordnung, das DeviceToken ist in Ordnung. Wenn Sie die App aktualisieren, weil auf dem Gerät bereits eine Version mit GCM vorhanden ist:

  • einige Geräte lassen sich problemlos in Parse registrieren
  • einige Geräte registrieren sich in Parse, aber ohne das DeviceToken

Für die Geräte, die nicht über das DeviceToken verfügen, habe ich eine Menge Dinge ausprobiert: Manuelles Einfügen eines DeviceToken, Deinstallieren und erneutes Installieren der Anwendung, Löschen der entsprechenden Zeile bei Parse usw. Aber nichts Gutes ... Dieses Problem tritt weiterhin auf.

MEIN CODE

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 In meiner mainActivity verkette ich nur das deviceToken (in meinem Fall die installationId) in meinen userAgent: und das funktioniert einwandfrei: Ich habe immer die installationId ohne Probleme! Und dies ist das einzige, was ich in meiner MainActivity mache (muss ich noch etwas tun? SaveInBackground, callback, etc ..?)

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

}

Ich weiß nicht wirklich, was ich sonst tun soll, deshalb hoffe ich, dass mir jemand dabei helfen kann.

Danke.

21
ernestocattaneo

Verwenden Sie zwei Benutzerprofile gleichzeitig auf dem Tablet? Weil ich genau das gleiche Problem hatte und aus meiner Erfahrung ein Konflikt zwischen den Profilen besteht. Tatsächlich, in meiner Situation registrierte ein Gerät zwei Zeilen in der Parse-Datenbank. Einer mit dem deviceToken und einer mit "undefined" deviceToken.

Leider habe ich dieses Problem noch nie gelöst, ich denke, das ist ein Fehler von Parse.

7
WiTHS4UC3

Es kann nützlich sein, die Protokollierungsprotokollierung auf ausführlich zu setzen, um das Debuggen weiter zu erleichtern:

Parse.setLogLevel(Parse.LOG_LEVEL_VERBOSE);

Dabei fiel mir auf, dass ich in meinem Manifest die falsche "sender_id" verwendete:

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

Das ist möglicherweise nicht die exakte Lösung, aber LOG_LEVEL_VERBOSE kann dazu beitragen, das Problem zu beheben.

2
mogile_oli

Ich hatte lange mit diesem Problem zu kämpfen, bis mir kürzlich klar wurde, was los ist. Der Paketname muss nicht nur übereinstimmen, sondern Sie müssen auch die Build-Variante in Ihre Deklaration aufnehmen.

Wenn Sie dem Parsentutorial gefolgt sind und com.parse.starter durch Ihren Paketnamen ersetzt haben, sind Sie fertig, wenn Sie keine Build-Variante haben, aber wenn Sie dies tun, müssen Sie das als solches angeben:

com.packagename.build_flavor {debuggen, freigeben usw.}

1
Paul Hundal

Bei einigen Installationen ist in der Spalte deviceToken eine GCM-Registrierungs-ID eingerichtet. Dies ist ein guter Hinweis darauf, dass Ihre Einrichtung korrekt ist. Ist es auf jeden Fall möglich, dass für eine Installation keine GCM-Registrierungs-ID vorhanden ist:

  • Das Gerät hat möglicherweise keinen Zugriff auf Google Services Framework (z. B. Amazon Kindle Fire). Wenn Sie den nicht-GCM-ParsePush-Empfänger eingerichtet haben, sollten Push-Vorgänge an diese Geräte weiterhin gesendet werden.
  • Die App wurde vom Gerät gelöscht und somit vom GCM nicht mehr registriert. In diesem Fall werden Installationen nicht automatisch gelöscht, da dies zu unbeabsichtigtem Datenverlust führen kann, da Sie in Ihrer Installationsklasse beliebige Daten speichern dürfen.
  • Google Services Framework war möglicherweise nicht verfügbar, als das Gerät versuchte, sich selbst zu registrieren.

In den ersten beiden Szenarien funktioniert dies wie erwartet und es ist im Allgemeinen kein Grund zur Sorge.

1
Héctor Ramos

Ich weiß nicht, ob diese Methode jemandem hilft, aber ich konnte den Gerätetoken und die Benachrichtigung korrekt abrufen, nachdem ich diese Zeile aus meiner Anwendungsklasse mit Parse-Intalation entfernt hatte. Hier ist der Code. Die kommentierte Zeile (entfernte Zeile) ließ alles richtig funktionieren. Kann jemand erklären, warum das funktioniert?

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

Ich hatte dieses Problem aber in einer Cordova-App mit dem Phonegap-Parse-Plugin. Ich musste den Android-Java-Code im Plugin bearbeiten, um das Problem zu beheben.

Fügen Sie diesen Speicher zwischen der Initialisierung und dem setDefaultPushCallback hinzu:

ParseInstallation.getCurrentInstallation().save();

Es muss zwischen ihnen sein, um zu arbeiten.

0
Andy Ballard

Sie können eine Klasse erstellen und Application erweitern, um Ihre App zu initialisieren. So initialisieren Sie ParsePush und updateParseInstallation.

Beispielcode:

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();
    }
}

Und dann in Ihrer 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

Sind diese Simulatorbenutzer? Wenn Sie eine Installation auf Ihrem Simulator ausführen, wird das Gerätetoken aus meiner Erfahrung nicht automatisch eingerichtet.

0
Drilem

Mein Problem war, dass mir diese Erlaubnis im Manifest fehlte:

<uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" />

Außerdem musste ich kurz vor <service Android:name="com.parse.PushService" /> Metadaten hinzufügen:

<meta-data
Android:name="com.parse.APPLICATION_ID"
Android:value="YourParseApplicationID" />

<meta-data
Android:name="com.parse.CLIENT_KEY"
Android:value="YourParseClientKey" />

Prüfen Sie nun, ob Sie das gerätetoken erhalten können. Überprüfen Sie auch Ihr App-Dashboard in Parse, ob alles in Ordnung ist.

0
L.Kovachev

Ich hatte ein ähnliches Problem nach dem Umbenennen des Moduls.

Probiere 'Clean Project' gefolgt von 'Rebuild Project'

0
Venkat Kotra