Noté que en iOS 11 beta 2, las notificaciones silenciosas no se entregan application:didReceiveRemoteNotification:fetchCompletionHandler
independientemente del estado de la aplicación (fondo / primer plano).
Implementé el UIApplicationDelegete
método application:didReceiveRemoteNotification:fetchCompletionHandler
y envié el siguiente envío silencioso
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
pero el método delegado no se llama en iOS 11.
Funciona bien en otras versiones de iOS y la sección de documentación Configuración de una notificación silenciosa no menciona que se deba hacer nada más.
¿Es esto un error en iOS 11 o me perdí algo nuevo en iOS 11?
Tenga en cuenta que no estoy hablando o usando el UserNotification
marco que no debería ser necesario para enviar notificaciones silenciosas.
Aquí hay un proyecto de muestra que ilustra el problema (deberá configurar su propia identificación de paquete)
Cuando almuerza el proyecto de muestra y envía una carga útil anterior a la aplicación, puede usar la consola macOS para ver que el envío se envía correctamente al dispositivo, pero no a la aplicación.
ACTUALIZACIÓN 10.08
Parece que el comportamiento es aleatorio. A veces, después de reiniciar el dispositivo, la carga útil se entrega correctamente pero deja de funcionar después de un tiempo.
Como puede ver en la siguiente captura de pantalla, la inserción marcada como 1 se entrega solo al dispositivo y la inserción 2 (después del reinicio del dispositivo) también se entrega a la aplicación.
ACTUALIZACIÓN 14.08 - iOS 11 Beta 6
Sigue siendo el mismo comportamiento. Otra cosa que se supone que funciona pero no funciona es la siguiente. Cuando el esquema de la aplicación se establece en "Esperar a que se ejecute el ejecutable", se supone que un impulso silencioso activa la aplicación y la inicia en segundo plano.
ACTUALIZACIÓN 21.08 - iOS 11 Beta 7
Sigue siendo el mismo comportamiento y no actualizaciones de Apple en el informe de error.
ACTUALIZACIÓN 29.08 - iOS 11 Beta 8
Sigue siendo el mismo problema. Los pasos para reproducir que uso ahora son los siguientes:
- En el esquema del proyecto Xcode, seleccione "Esperar a que se ejecute el ejecutable"
- Agregar un punto de interrupción en el
didReceiveRemoteNotification: fetchCompletionHandler
- Inicie la aplicación en el dispositivo
- Enviar el empuje silencioso anterior
Esperado : la aplicación pasa del estado suspendido al fondo y didReceiveRemoteNotification: fetchCompletionHandler
se llama
Actual : no pasa nada
ACTUALIZACIÓN 06.09 - iOS 11 Beta 10
Todavía estoy teniendo el mismo comportamiento con errores. El boleto de Apple se actualizó con la siguiente respuesta:
Relaciones con los desarrolladores de Apple 6 de septiembre de 2017, 10:42 p.m. Ingeniería ha proporcionado los siguientes comentarios sobre este problema:
Pudimos ejecutar la aplicación de muestra y probar el comportamiento. No vimos ningún problema cuando probamos esto como se describe.
No se garantiza que las aplicaciones lleguen a la aplicación cuando se está ejecutando en segundo plano, y los registros aquí indican que no creemos que la aplicación se esté utilizando lo suficiente como para iniciarla.
Nos vemos entregando empujones de vez en cuando cuando las condiciones son buenas.
Creemos que esto se está comportando correctamente.
Actualización 11.09
Mi informe de error de Apple se cerró y se marcó como duplicado, el 33278611
cual permanece abierto
ACTUALIZACIÓN 13.09 - iOS 11 GM
Gracias a los comentarios de kam800 (ver abajo) hice más pruebas y obtuve esas observaciones:
Parece que hay un nuevo demonio en iOS 11 dasd DuetActivitySchedulerDaemon
que descarta completamente el envío de datos o retrasa la entrega del envío de datos:
Entrega aplazada
Registros de consola
default 13:11:47.177547 +0200 dasd DuetActivitySchedulerDaemon CANCELED: com.apple.pushLaunch.net.tequilaapps.daylight:C03A65 <private>! lifecycle com.apple.duetactivityscheduler
default 13:11:47.178186 +0200 dasd DuetActivitySchedulerDaemon Removing a launch request for application <private> by activity <private> default com.apple.duetactivityscheduler
default 12:49:04.426256 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.5 minutes to Wed Sep 13 12:55:31 2017 default com.apple.duetactivityscheduler
default 13:21:40.593012 +0200 dasd DuetActivitySchedulerDaemon Activity <private>: Optimal Score 0.6144 at <private> (Valid Until: <private>) scoring com.apple.duetactivityscheduler
default 13:21:40.594528 +0200 dasd DuetActivitySchedulerDaemon Setting timer (isWaking=1, activityRequiresWaking=0) between <private> and <private> for <private> default com.apple.duetactivityscheduler
Problemas de entrega pospuestos
- Cuando la entrega de envío de datos se pospone y se inicia la aplicación, el envío de datos se entrega solo cuando se alcanza la fecha de entrega, que puede ser de varios minutos en el futuro. Esto anula por completo el propósito de usar datos para mantener el contenido de la nueva aplicación listo para el próximo lanzamiento. Cito aquí una vez más la documentación de Apple:
"Las notificaciones silenciosas mejoran la experiencia del usuario al ayudarlo a mantener su aplicación actualizada, incluso cuando no se está ejecutando".
- Cuando se envían dos datos empujados a una aplicación suspendida, iOS 11 los pospone en lugar de activar la aplicación directamente. Cuando se alcanza el tiempo de entrega, ¡ solo se entrega el último envío de datos! Los empujes anteriores se pierden y no se entregan a través del método delegado, lo que resulta en una pérdida de datos.
Entrega cancelada
Registros de consola
default 13:35:05.347078 +0200 dasd DuetActivitySchedulerDaemon com.apple.pushLaunch.net.tequilaapps.daylight:C03A65:[
{name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}}
], FinalDecision: Must Not Proceed} scoring com.apple.duetactivityscheduler
Problemas de entrega cancelados
Bueno, en este caso, el envío de datos se pierde por completo y nunca se entregó en iOS 11 mientras se entregó correctamente en iOS 10.
ACTUALIZACIÓN 19.09 - iOS 11 GM
También noté que cuando la aplicación está en primer plano y la notificación no se entrega a la aplicación, veo los siguientes registros en la consola:
default 08:28:49.354824 +0200 apsd apsd <private>: Received message for enabled topic '<private>' onInterface: NonCellular with payload '<private>' with priority 10 for device token: NO courier-oversized com.apple.apsd
fault 08:33:18.128209 +0200 dasd Foundation <NSXPCConnection: 0x151eee460> connection from pid 55: Exception caught during decoding of received message, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
Exception: value for key 'NS.objects' was of unexpected class 'NSNull'. Allowed classes are '{(
NSArray,
NSData,
NSString,
NSNumber,
NSDictionary,
NSUUID,
_DASActivity,
NSSet,
_DASFileProtection,
NSDate,
NWParameters,
NWEndpoint
)}'. general com.apple.foundation.xpc
"content-available": 1
y la aplicación está en primer plano, la devolución de llamada no se activará.