it-swarm.com.ru

PARSE: Push-уведомления "deviceToken" не определены

Это ситуация на моей странице установки на консоли Parse:

enter image description here

Как вы видите, некоторые устройства имеют «deviceToken», а некоторые не имеют «deviceToken». Это не хорошо, потому что каждое устройство должно иметь deviceToken, чтобы работать.  

Как это возможно? Это серьезная проблема, потому что те, у кого нет устройства Token не получают Push-уведомления!

Я следовал всем инструкциям на Parse.com и реализовал все, как они сказали, даже с помощью своего пустого проекта и с помощью различных вопросов в Интернете. Но ничто не решило мою проблему, и теперь я ничего не могу сделать.

Единственное, о чем я могу думать, это то, что до того, как мое приложение (оно уже находится в Магазине) использовало Google Cloud Messaging а затем с этим новым обновлением я решил изменить систему и использовать Parse удаление полностью системы GCM. Есть ли конфликт между двумя системами?

Мне нужно исправить это, поскольку вы можете представить, что это серьезная ошибка, и теперь 3/4 моих пользователей не получают Push-уведомления.

Если вы загружаете приложение и устанавливаете его: все хорошо, deviceToken в порядке. Если вы обновляете приложение, потому что на устройстве уже была версия с GCM:

  • некоторые устройства в Parse регистрируются хорошо, без проблем
  • некоторые устройства регистрируются в Parse но без deviceToken

Для устройств, которые не имеют deviceToken, я перепробовал много вещей: вставка deviceToken вручную, удаление и переустановка приложения, удаление определенной строки при разборе и т.д. Но ничего хорошего ... Все еще сталкиваюсь с этой проблемой.

МОЙ КОД

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 (в моем случае это ID установки) в мой userAgent: и это прекрасно работает: у меня всегда есть ID установки без проблем! И это единственное, что я делаю в MainActivity (нужно ли что-то еще делать? SaveInBackground, callback и т.д.?)

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 профиля пользователя на планшете? Потому что у меня была точно такая же проблема, и из моего опыта существует конфликт между профилями. Фактически, в моей ситуации одно устройство регистрировало 2 строки в базе данных Parse. Один с deviceToken и один с «неопределенным» 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, что является хорошим показателем правильности настроек. Определенно возможно ли для установки отсутствие регистрационного идентификатора GCM:

  • Устройство может не иметь доступа к Google Services Framework (например, Amazon Kindle Fire). Если вы настроили приемник ParsePush не GCM, отправка на эти устройства все равно должна быть доставлена.
  • Приложение было удалено с устройства и, таким образом, оно было незарегистрировано в GCM. В этом случае мы не удаляем установки автоматически, так как это может привести к непреднамеренной потере данных, если вы можете хранить произвольные данные в классе установки.
  • Google Services Framework может быть недоступен, когда устройство пытается зарегистрироваться.

В первых двух сценариях это работает, как и ожидалось, и не о чем беспокоиться.

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

У меня была эта проблема, но в приложении Cordova с использованием PhoneGap-Parse-плагин. Я должен был отредактировать код Android Java в плагине, чтобы исправить, так что эффективно то же самое.

Попробуйте добавить это сохранение между инициализацией и setDefaultPushCallback:

ParseInstallation.getCurrentInstallation().save();

Это должно быть между ними, чтобы работать.

0
Andy Ballard

Вы можете создать класс и расширить 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);
                            }
                       }
          });
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. Также проверьте панель приложения в Parse, если все в порядке.

0
L.Kovachev

У меня была похожая проблема после переименования модуля.

Попробуйте «Чистый проект», а затем «Перестроить проект»

0
Venkat Kotra