Pushes no recibidos después de que la aplicación esté cerrada

Antes de etiquetar esto como un duplicado:

He leído por lo menos 15 subprocesos similares y cada uno o bien está usando el antiguo código de Parse (el ahora descontrolado setDefaultPushCallback) o el problema fue el resultado de llamar a Parse.initialize (…) en una actividad y no en la Clase de aplicación. Pero esto no es aplicable a mi caso. El ejemplo oficial (que estoy usando) es evidente que hacerlo bien, por lo que el código ya está en la clase de aplicación.

He descargado el ejemplo Push Starter de las guías oficiales de Parse y lo he probado en un emulador. Recibo push sólo mientras se ejecuta la aplicación. El momento es cerrado (eliminado de la lista de "aplicaciones recientes", no es forzado a matar), ya no me empujan. Lo que hace que toda la característica bastante inútil … He intentado con y sin GCM, el comportamiento es el mismo.

¿Alguna pista de lo que podría estar mal? Todas las clases son las de ejemplo de archivo, nada reemplazado o agregado por mí (excepto por la clave id / y la llamada ParsePush.subscribeInBackground que copié de la guía). Curiosamente, el código de ejemplo no contenía ParsePush.subscribeInBackground y el QuickStart no lo menciona. Incluso da un botón de prueba que supuestamente envía un empuje que nunca recibo, con o sin subscribeInBackground. La única manera que he podido conseguir un empuje hasta ahora era con subscribeInBackground y enviar un empuje manualmente a través de la consola web, y sólo así si la aplicación se está ejecutando. La consola web también sigue diciendo que hay 2 dispositivos registrados … lo cual es falso.

Manifiesto:

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

2 Solutions collect form web for “Pushes no recibidos después de que la aplicación esté cerrada”

Sólo para aclarar por qué está viendo este comportamiento, Parse tiene dos formas diferentes de entregar notificaciones push:

  1. "Parse way": el Parse SDK tiene un componente que se ejecuta en su aplicación, que mantiene una conexión con los servidores backend de Parse. Esto sólo funcionará cuando su aplicación esté en ejecución, ya que matarla rompe la conexión con el backend de Parse.
  2. Notificaciones push de GCM "Google": funciona a través de Google Play Services, una aplicación que se ejecuta siempre en segundo plano y que puede iniciar tu aplicación cuando sea necesario. Esto siempre funcionará, a menos que se detenga la aplicación.

En su caso usted está allí es un conflicto del nombre del paquete: com.parse.starter es el nombre del paquete que fue incluido realmente en el ejemplo. Esto hace que GCM no funcione, porque ya conoce el paquete bajo una firma diferente. Cambiar el nombre de su paquete a algo único como com.parse.kaqqao debe resolver el truco.

Hay algunas razones para esto:

  1. Hay dos BroadcastReceiver a saber el "com.parse.ParsePushBroadcastReceiver" y "com.parse.GcmBroadcastReceiver". Creo que el primer receptor se está priorizando sobre el GCMBroadcastReceiver y por lo tanto el comportamiento no se ve afectado por la eliminación o mantenimiento de este receptor. También podría deberse a la acción "com.parse.push.intent.RECEIVE", que podría estar manejando la acción RECEIVE de mensajes push. Si el receptor realiza la misma tarea de analizar el mensaje Push (iniciando el mismo servicio en segundo plano), incluya el filtro de intenciones dentro de un receptor y deje que se ocupe de todo tipo de mensajes push. Desde GCMBroadcastReceiver tiene el permiso de C2DM.

  2. Intente cambiar el orden de las dos etiquetas del receptor de difusión en el manifiesto. (Mantenga GCMBroadcastReceiver antes del ParsePushBroadcastReceiver)

  3. Podría ser debido a android: exportado = "false", tal vez impide que el Receptor escuche los mensajes push enviados por el servidor. Intente cambiar a verdadero.

  • GCM enviar imagen en lugar de mensaje
  • Notificaciones push iOS y código nativo cliente-cliente de Android
  • Mensaje GCM de Android enviado correctamente pero no recibido
  • Notificaciones Push utilizando el servidor Rails
  • GCM de Android (notificación push): el dispositivo no recibe notificación si se detiene la aplicación
  • Genera un identificador único como ID de notificación de android
  • Solicitud del ID de registro de Google Cloud Messaging (GCM) cada vez que se inicia la aplicación
  • No se puede recibir notificación push en Android mediante Parse
  • Notificaciones push de GCM que no proceden de proxy
  • ¿Es gratuito Firebase Cloud Messaging?
  • Android: ¿cómo puedo enviar una notificación de GCM push con instrucciones de qué actividad cargar?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.