nombre - Notificaciones push que activan una actualización de fondo antes de mostrar la notificación push VS push silencioso
notificaciones push iphone mail (2)
He estado luchando con la misma tarea en mi aplicación de mensajería . Queríamos que los usuarios vieran el mensaje justo antes de que el usuario toque la notificación. Con lo que nos enfrentamos:
- La limitación del tamaño de la carga útil. iOS 7 solo puede tener 256 bytes para carga útil
- Las notificaciones silenciosas únicas no iniciarán una aplicación si no se está ejecutando.
-
content-available
notificaciones decontent-available
sin cuerpo de alerta pueden incluso no ser enviadas al dispositivo - La aplicación no controla la recuperación de fondo, por lo que es posible que nunca reciba la señal deseada, por lo que no podemos confiar en esta función. Pero esto puede ser útil como una forma adicional de lograr lo que queremos.
- iOS 8 tiene mucho espacio para carga útil - 2KB
- Si envía el cuerpo de alerta y el
content-available
, se entregará en la mayoría de los casos y una aplicación puede procesarlo.
Así que llegamos a la única solución aceptable: decidimos hacer esta función solo en ios8 +. Enviamos notificaciones push visibles con clave de content-available
que nos permite procesar la carga útil de notificación si el proceso se está ejecutando / congelando y ambos pueden presentar la notificación si la aplicación no se está ejecutando. Si una aplicación recibe una notificación de inserción, toma el cuerpo del texto de alerta y lo escribe en la base de datos local, para que el usuario pueda leerlo en la conversación. Según nuestras estadísticas, el tamaño promedio del mensaje no es más de 200 símbolos, por lo que la mayoría de las veces no se requieren solicitudes adicionales. Si el mensaje tiene más de 200 símbolos, extendemos el cuerpo de la carga útil con un parámetro adicional que se utiliza para solicitar el cuerpo del texto en el procesamiento de notificaciones push. El usuario verá una versión recortada del texto, pero después de que se realiza una solicitud, reescribimos un mensaje en la base de datos local con el valor recibido.
Entonces, esa técnica nos permite mostrar un mensaje recibido al usuario inmediatamente en la mayoría de los casos + si la aplicación no se estaba ejecutando, le solicitamos a nuestro servidor que busque los mensajes que faltan justo después del inicio de la aplicación. Este es el caso más rápido y más aceptable que podríamos obtener en iOS. Espero que mi experiencia te ayude a implementar lo que quieras.
Quiero implementar la funcionalidad de actualización en segundo plano en mi aplicación para cuando se reciba un envío. Justo antes de que se muestre la notificación al usuario, deseo descargar los nuevos mensajes de mi backend (Parse.com) y guardarlos en una matriz. Estoy siguiendo una guía desde aquí: http://developer.xamarin.com/guides/ios/application_fundamentals/backgrounding/part_3_ios_backgrounding_techniques/updating_an_application_in_the_background/
No estoy seguro de cuán precisa es esta guía. Indica: iOS 7 (y más) extiende las notificaciones push normales al dar a las aplicaciones la oportunidad de actualizar el contenido en segundo plano antes de notificar al usuario, para que el usuario pueda abrir la aplicación y se le presente contenido nuevo de inmediato.
Así que intenté implementar mi empuje de fondo de esta manera:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler
{
if([[userInfo objectForKey:@"aps"] objectForKey:@"content-available"]){
NSLog(@"Doing the background refresh");
UINavigationController *navigationController=(UINavigationController *)[[[UIApplication sharedApplication] keyWindow] rootViewController];
MyViewController *myViewController = (MyViewController *)[[navigationController viewControllers] objectAtIndex:1];
[myViewController.currentUser refreshMessagesArrayWithCompletionHandler:^(BOOL successful, BOOL newMiaos) {
NSLog(@"messages refreshed the array now has %lu messages",(unsigned long)[myViewController.currentUser.messages count]);
handler(UIBackgroundFetchResultNewData);
}];
}
}
Se llama a la actualización de fondo y se muestra la inserción, sin embargo, la notificación de inserción no espera a que finalice la tarea de fondo. Sólo se muestra tan pronto como se recibe. ¿Es esta funcionalidad correcta? El tutorial anterior sugiere que no se mostrará una notificación hasta que se complete la tarea en segundo plano.
Luego traté de probar una notificación silenciosa , esto activa la aplicación para descargar los mensajes en segundo plano cuando se recibe el envío pero no se muestra ninguna notificación. Así que hago esto activando una notificación local después de que se complete la descarga. ¿Es esta realmente la forma correcta de hacerlo? ¿Las aplicaciones tradicionales como whatsapp activan una actualización de fondo usando una notificación silenciosa y luego activan una local? Parece un poco hacky. Seguramente la idea de un impulso de fondo es preparar los datos antes de mostrar la notificación, pero no funciona de esa manera ...
La otra cosa que noté es que las notificaciones silenciosas tienen una tasa limitada , tienen una prioridad más baja que las típicas notificaciones push, por lo que seguramente esto dificulta la eficiencia de la aplicación ...
Cualquier sugerencia sobre esto sería realmente apreciada. Solo trato de moverme la cabeza si me estoy acercando a esto de la manera correcta o no. Todo parece muy hacky ...
Mezclaste algunas cosas juntas.
De un rápido vistazo a su enlace, esta es una guía para xamarin
. Puede haber alguna información correcta allí, pero si no está utilizando xamarin
, buscaría otro tutorial.
Un buen enfoque sería enviar una notificación silenciosa al usuario y activar una notificación local cuando se haga (lo que no es en absoluto hacky).
Así es como WhatsApp está haciendo que funcione:
Mientras que whatsApp está en segundo plano, se recibe una única notificación de inserción (por ejemplo, "5"). Ese mensaje no se mostrará al usuario.
whatsApp lo recibe en la application:didReceiveRemoteNotification:fetchCompletionHandler:
método application:didReceiveRemoteNotification:fetchCompletionHandler:
y verifica en sus servidores si hay alguna notificación antes de "5" que el usuario no haya recibido. Si ese es el caso, extraerán esos datos de sus servidores y los presentarán al usuario mediante notificaciones locales, que es básicamente una forma de presentar datos y no están relacionados con APNS en absoluto.
Puedes leer la respuesta completa y el contexto en otra respuesta que escribí here