ios - receive - remote push notification
Notificaciones push silenciosas solo entregadas si el dispositivo se está cargando y/o la aplicación está en primer plano (8)
Con iOS8, el envío de fondo a las aplicaciones ha cambiado. Ahora solo se enviará un impulso de fondo a la aplicación en determinadas circunstancias. Apple no ha declarado explícitamente cuáles son exactamente estas circunstancias, pero a partir de mi extensa experimentación, básicamente se reduce a si el teléfono se está cargando o no. Hay otras variables en juego (como el tipo de red, el tipo de dispositivo, el wifi habilitado) pero el principal factor importante es si el dispositivo se está cargando o no cuando llega el empuje.
Si el teléfono se está cargando a través de una fuente de alimentación de red directa o indirectamente al estar conectado por USB a una computadora, entonces los impulsos de fondo se enviarán a la aplicación la mayor parte del tiempo. Pero desconecte el teléfono de la fuente de alimentación o del USB y el impulso de fondo casi nunca se entregará a la aplicación, incluso si la batería del teléfono tiene una carga del 100%.
Usted puede probar esto fácilmente por sí mismo simplemente enviando algunos datos mientras se carga el teléfono, mientras que no lo hace. PERO debe tener en cuenta que los impulsos en segundo plano con una compilación de desarrollo y el uso del entorno de espacio aislado no se comportan igual que los impulsos en segundo plano con una compilación de producción y un entorno de producción, en realidad es más probable que los impulsos en segundo plano se entreguen a la aplicación en desarrollo luego están en producción, por lo que es vital que realice pruebas usando una compilación de producción y el entorno de producción de Apple para ver los resultados reales.
Tenga en cuenta que hay dos pasos para la entrega automática, el primero es que debe ser entregado al teléfono mismo, el segundo es que una vez que el teléfono lo tiene, luego debe ser entregado por el sistema operativo a la aplicación. En iOS7, cosas como el encendido de Wifi aumentaron las posibilidades de que el empuje llegara al teléfono. Sin embargo, con iOS8, a pesar de que el envío se envía con éxito al teléfono, el sistema operativo no lo reenvía a una aplicación en segundo plano si el teléfono no se está cargando. Esto significa que el teléfono recibe la notificación y la retiene, a veces durante varias horas, antes de que pueda reenviarla a la aplicación si no se está cargando el teléfono.
He implementado notificaciones push silenciosas pero he notado algunos comportamientos extraños. Las notificaciones push silenciosas se manejan a través de:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
Los mensajes de inserción silenciosos solo parecen recibirse si el dispositivo se está cargando (es decir, con un cable conectado) y / o si mi aplicación está en primer plano.
Si desconecto el dispositivo del cargador (o Mac), las notificaciones push silenciosas ya no se reciben a menos que la aplicación esté en primer plano.
Normalmente recibo notificaciones push no silenciosas en ambos casos.
Si vuelvo a enchufar el cable USB, obtengo el comportamiento esperado y recibo notificaciones push silenciosas independientemente de si la aplicación está en primer plano o en segundo plano.
Estoy usando UILocalNotification para saber qué se está recibiendo.
El hecho de que todo funcione bien con el dispositivo conectado sugiere que mis notificaciones de envío silencioso están configuradas correctamente y que la aplicación tiene los modos de fondo correctos establecidos en la lista, etc.
Este comportamiento es repetible en iPhone 5s, 6 y iPad 2, todos ejecutando IOS 8 u 8.1.
Alguien más ha experimentado esto? Debe ser fácil de reproducir. ¿Por qué el simple hecho de conectar un dispositivo a un cargador cambia la capacidad de recibir notificaciones automáticas silenciosas?
Encontré otra solución que me funcionó utilizando PushKit Framework.
Los empujes de VoIP proporcionan una funcionalidad adicional además del empuje estándar que se necesita para que las aplicaciones de VoIP realicen un procesamiento a pedido del empuje antes de mostrar una notificación al usuario
Cuando envío VOIP Push, la aplicación se activa independientemente del estado de la aplicación y puede realizar cualquier operación
Regístrese para PushOotification VOIP en didFinishLaunchingWithOptions
PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
pushRegistry.delegate = self;
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type{
if([credentials.token length] == 0) {
NSLog(@"voip token NULL");
return;
}
NSString *originalToken=[NSString stringWithFormat:@"%@",credentials.token];
NSString *token = [originalToken stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]];
token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"PushCredentials: %@",token);}
entonces puede manejar cualquier búsqueda de fondo en esta función una vez que reciba VOIP PushNotification
-(void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type
NOTA: debe usar un certificado que habilite el Certificado de Servicios VoIP
Espero que estés usando APNS que da prioridad como "CONSERVE_POWER" (5)
, intenta cambiarlo como "IMMEDIATE" (10)
Había experimentado el mismo problema y la razón por la que no recibía una notificación de inserción mientras la aplicación no se está cargando es que cuando el Modo de bajo consumo de energía está habilitado en Settings > Battery
, desactiva la función de background-fetch
para todas las aplicaciones.
Lo que evita que el dispositivo reciba notificaciones push.
Este enlace puede ser útil. Documentación de Apple
He estado experimentando este problema durante algún tiempo, y estoy muy agradecido por esta pregunta y por @Kevin D. compartiendo su comprensión. Estoy empezando a pensar que https://.com/a/30834566/1449799 y https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW4 (ver priority
en una de las tablas) describe por qué mi aplicación está teniendo problemas:
Es un error utilizar esta prioridad para una inserción que contiene solo la clave de
content-available
.
Para enviar las notificaciones, estoy usando node-apn donde el valor predeterminado (que también necesito) es establecer la prioridad en max ( 10
[cuidado, parece que solo 10
y 5
son valores correctos en este momento]), pero ya que quería una notificación silenciosa , no tengo alert
, badge
o conjunto de sound
.
Hemos experimentado el mismo comportamiento y hemos estado tratando de entender por qué iOS decide entregar algunas notificaciones y no otras.
Lo que hemos trabajado hasta ahora es:
Los mensajes se recibirán de manera más confiable en segundo plano cuando esté en wifi y luego en datos celulares. De hecho, cuando está en una red celular (3g / 4g), si la intensidad de su señal no es lo suficientemente fuerte, iOS recibe el mensaje de inserción, pero no activará su aplicación. Publicamos en los foros de Apple al respecto aquí: https://devforums.apple.com/message/1069814#1069814 . También abrimos un ticket de soporte, y el equipo de soporte nos dijo que lo presentáramos como un informe de error, que hicimos hace un par de semanas y todavía estamos esperando la respuesta.
Cuando recibe un mensaje de inserción, debe llamar a fetchCompletionHandler lo antes posible. Técnicamente, tiene 30 segundos para realizar el procesamiento en segundo plano, pero iOS tiene una fórmula mediante la cual, con mayor frecuencia, envía mensajes de inserción y, dependiendo de la cantidad de tiempo que pase procesando esos mensajes antes de devolver la aplicación al estado suspendido, iOS puede reducir la cantidad de veces tu aplicación se despierta en el futuro.
Vea aquí de Apple didReceiveRemoteNotification: fetchCompletionHandler: documentación:
Tan pronto como termine de procesar la notificación, debe llamar al bloque en el parámetro del controlador o su aplicación finalizará. Su aplicación tiene hasta 30 segundos de tiempo de reloj de pared para procesar la notificación y llamar al bloqueo del controlador de finalización especificado. En la práctica, debe llamar al bloqueo del controlador tan pronto como haya terminado de procesar la notificación. El sistema rastrea el tiempo transcurrido, el uso de energía y los costos de datos para las descargas en segundo plano de su aplicación. Es posible que las aplicaciones que utilizan cantidades importantes de energía al procesar notificaciones automáticas no siempre se activen pronto para procesar notificaciones futuras.
En nuestras pruebas, hemos estado enviando frecuentes notificaciones push silenciosas a nuestra aplicación (cada 10 - 30 segundos). Y la aplicación está despierta durante unos 3 segundos antes de volver a ponerla en reposo. Definitivamente, hemos notado con el tiempo una degradación en la frecuencia con la que nuestra aplicación se reactiva hasta el punto en que iOS solo activará la aplicación cada 15 a 30 minutos. Así que parece que hay algún tipo de fórmula de decaimiento / aceleración en su lugar, pero no podemos encontrar ninguna documentación sobre cómo funciona exactamente. Hemos solicitado esta fórmula y las variables de Apple como una solicitud de asistencia, pero dijeron que "la información que está solicitando no está disponible públicamente" y nuevamente nos solicitó que presentemos un informe de error.
Entonces, espero que esto sea útil? Todavía estamos intentando aprender más nosotros mismos, por eso encontré esta pregunta :)
No funciona porque has habilitado el modo de fondo incorrecto en el plist. Debe habilitar la etiqueta de remote-notification
(la aplicación descarga contenido en respuesta a las notificaciones push), no la recuperación. Fetch se utiliza para otra cosa. Es posible que también necesite usar la clave de contenido disponible en su carga de JSON, por ejemplo,
{
"aps": {
"content-available": 1
},
"yourdatakey":{data}
}
También me di cuenta de lo mismo y perdí un poco de tiempo averiguando. Consulte https://.com/a/31237889/1724763
Si desactivó Bg App Refresh, la pulsación remota silenciosa se eliminará en silencio (la ironía).
Sin embargo, mi observación es que si te conectas a Xcode a través de un cable, de alguna manera se ignora la configuración de actualización de la aplicación Bg y todo el impulso silencioso de tu aplicación funciona.
Sospecho que esta es una función no documentada: la carga hace que se ignore la configuración de actualización de la aplicación Bg.