2015-02-08 15 views
6

przed znakowaniem to jako duplikat:nie popycha otrzymane po aplikacja jest zamknięty

czytałem co najmniej 15 Podobne wątki i każda z nich jest albo za pomocą starego kodu Parse (the teraz przestarzałe setDefaultPushCallback) lub problem był wynikiem wywołania funkcji Parse.initialize (...) w działaniu, a nie w klasie Application. Ale to jest nie dotyczy mojej sprawy. Oficjalny przykład (którego używam) ewidentnie robi to dobrze, więc kod jest już w klasie Application.

Pobrałem plik Push Starter example from Parse's official guides i wypróbowałem go na emulatorze. Otrzymuję wypychania tylko wtedy, gdy aplikacja jest uruchomiona. Chwila, gdy jest zamknięta (usunięta z listy "ostatnich aplikacji", a nie wymuszona), już nie dostaję wypychania. Co sprawia, że ​​cała funkcja jest raczej bezużyteczna ... Próbowałem z GCM i bez niego, zachowanie jest takie samo.

Jakieś wskazówki, co może być nie tak? Wszystkie klasy są przykładowymi przykładami, niczego nie przesłoniłem ani nie dodałem (wyjątkiem jest id/key i wywołanie ParsePush.subscribeInBackground, które skopiowałem z przewodnika). Co dziwne, przykładowy kod nie zawierał ParsePush.subscribeInBackground, a QuickStart go nie wspomina. Daje nawet przycisk testu, który rzekomo wysyła naciśnięcie, którego nigdy nie otrzymuję, z lub bez subskrybowaniaInBackground. Jedyny sposób, w jaki udało mi się uzyskać dotychczasowy push, polegał na subskrybowaniuBackground i ręcznym wysyłaniu przez konsolę internetową i tylko wtedy, gdy aplikacja jest uruchomiona. Konsola internetowa również informuje, że są 2 zarejestrowane urządzenia ... co jest nieprawdą.

Oczywisty:

<?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> 

ParseApplication:

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

Cześć Kaqqao, otrzymywanie powiadomień push przez "Parse Way" przestanie działać, gdy zabijesz swoją aplikację od niedawna. Dzieje się tak, ponieważ zabicie aplikacji powoduje przerwanie połączenia z serwerami zaplecza programu Parse, a zatem serwery nie mogą już niczego naciskać. Powiadomienia push za pośrednictwem GCM powinny działać, nawet jeśli twoja aplikacja zostanie zabita (nie wymuszona zatrzymana). Dzieje się tak dlatego, że GCM działa za pośrednictwem Usług Google Play, aplikacji, która zawsze działa w tle i która może uruchomić Twoją aplikację w razie potrzeby (i nie wymuszać jej wstrzymania). Twój kod również wygląda poprawnie, więc naprawdę nie widzę problemu. –

+0

Zastanawiam się, czy istnieje konflikt nazwy pakietu (ponieważ używasz tego samego pakietu co przykład), w ten sposób istnieje wiele aplikacji z tym samym pakietem, ale inny podpis. Czy możesz spróbować zmienić swój pakiet na coś wyjątkowego? 'com.parse.kaqqao' –

+0

@jmols OMG, wygląda na to, że twoja teoria nazw pakietów była poprawna! Po zmianie nazwy zacząłem otrzymywać wiadomości z zamkniętą aplikacją. Nie wiadomo, dlaczego działało z uruchomioną aplikacją, ale ... Czy w takim razie chciałbyś zamienić dwa komentarze w odpowiedź, aby móc przyznać nagrodę, zanim wygaśnie? – kaqqao

Odpowiedz

1

Wystarczy, aby wyjaśnić, dlaczego widzisz ten problem, Parse ma dwa różne sposoby dostarczania powiadomień push:

  1. "Pa rse way ": pakiet SDK Parse zawiera komponent działający w aplikacji, który utrzymuje połączenie z serwerami zaplecza programu Parse. Będzie działać tylko wtedy, gdy aplikacja jest faktycznie uruchomiona, ponieważ zabicie jej powoduje przerwanie połączenia z zapleczem funkcji Parse.
  2. Powiadomienia push "Google" w GCM działają za pośrednictwem Usług Google Play, aplikacji działającej zawsze w tle i mogącej uruchomić aplikację w razie potrzeby. To zawsze zadziała, chyba że wymusisz zatrzymanie aplikacji.

W twoim przypadku występuje konflikt nazwy pakietu: com.parse.starter to nazwa pakietu, która została faktycznie uwzględniona w przykładzie. To powoduje, że GCM nie działa, ponieważ już zna pakiet pod innym podpisem. Zmiana nazwy pakietu na coś unikalnego, takiego jak com.parse.kaqqao, powinno rozwiązać problem.

1

Istnieje kilka powodów:

  1. Istnieją dwa BroadcastReceiver mianowicie na "com.parse.ParsePushBroadcastReceiver" i "com.parse.GcmBroadcastReceiver". Uważam, że pierwszy odbiorca otrzymuje priorytet nad GCMBroadcastReceiver, a zatem zachowanie to nie ma wpływu na usunięcie lub utrzymanie tego odbiornika. Może to być również spowodowane działaniem "com.parse.push.intent.RECEIVE", które może obsługiwać działanie RECEIVE komunikatów push.Jeśli oba odbiorniki wykonują to samo zadanie analizowania wiadomości Push (uruchamianie tej samej usługi w tle), włącz filtr intencji do jednego odbiornika i pozwól mu obsługiwać wszystkie rodzaje komunikatów push. Ponieważ GCMBroadcastReceiver posiada uprawnienia C2DM.

  2. Spróbuj zmienić kolejność dwóch tagów odbiornika w manifeście. (Zachowaj GCMBroadcastReceiver przed ParsePushBroadcastReceiver)

  3. Może to być spowodowane przez android: exported = "false", może uniemożliwić odbiorcy słuchanie wiadomości Push wysyłanych przez serwer. Spróbuj zmienić na true.