Compartir a través de


Actualización de una aplicación de Xamarin.iOS en segundo plano

La actualización en segundo plano es el proceso de despertar una aplicación suspendida o no en ejecución y actualizarla con contenido nuevo. iOS proporciona tres opciones para actualizar el contenido en segundo plano:

  1. Supervisión de regiones y Servicio de cambios significativos de ubicación: las API compatibles con la ubicación desencadenan actualizaciones en segundo plano en función de los cambios en la ubicación del usuario. Estas API se pueden usar con discreción para actualizar el contenido en aplicaciones iOS 6 no basadas en ubicación, donde otras opciones no están disponibles.
  2. captura en segundo plano (iOS 7+ ): un enfoque temporal para actualizar contenidono crítico que actualiza con frecuencia.
  3. Notificaciones remotas (iOS 7+): las aplicaciones que reciben notificaciones push pueden usar las notificaciones para desencadenar actualizaciones de contenido en segundo plano. Este método se puede usar para actualizar con contenido importante y sensible al tiempo que se actualiza esporádicamente .

En las secciones siguientes se tratan los conceptos básicos de estas opciones.

Supervisión de regiones y cambios significativos en la ubicación

iOS proporciona dos API compatibles con la ubicación con funcionalidades de segundo plano:

  1. La supervisión de regiones es el proceso de configuración de regiones con límites y la activación del dispositivo cuando el usuario entra o sale de una región. Las regiones son circulares y pueden tener un tamaño variable. Cuando el usuario cruza un límite de región, el dispositivo se reactivará para controlar el evento, normalmente activando una notificación o iniciando una tarea. La supervisión de regiones requiere GPS y aumenta el uso de la batería y los datos.
  2. El Servicio de cambios significativos de ubicaciónes una opción más sencilla y de conservación de energía disponible para dispositivos con radios móviles. Se notificará a una aplicación que escuche cambios significativos en la ubicación cuando el dispositivo cambie las torres de celda. Este servicio se puede usar para reactivar una aplicación suspendida o terminada y ofrece la oportunidad de comprobar si hay contenido nuevo en segundo plano. La actividad en segundo plano se limita a unos 10 segundos, a menos que esté emparejada con una tarea en segundo plano .

Una aplicación no necesita la ubicación UIBackgroundModepara usar estas API compatibles con la ubicación. Dado que iOS no realiza un seguimiento de los tipos de tareas que se pueden ejecutar cuando el dispositivo se reactiva mediante cambios en la ubicación del usuario, estas API proporcionan una solución alternativa para actualizar el contenido en segundo plano en iOS 6. Tenga en cuenta que desencadenar actualizaciones en segundo plano con API basadas en ubicación se dibujará en los recursos del dispositivo y puede confundir a los usuarios que no entienden por qué una aplicación requiere acceso a su ubicación. Use discreción al implementar la supervisión de regiones o cambios significativos de ubicación para el procesamiento en segundo plano en aplicaciones que aún no usan las API de ubicación.

Las aplicaciones que usan la supervisión de ubicación para el procesamiento en segundo plano exponen un error en iOS 6: si las necesidades de una aplicación no caben en una categoría necesaria en segundo plano, tiene opciones de fondo limitadas. Con la introducción de dos nuevas API, Captura en segundo plano y Notificaciones remotas, de iOS 7 (y versiones posteriores) proporciona oportunidades de segundo plano para más aplicaciones. En las dos secciones siguientes se presentan estas nuevas API.

Captura en segundo plano (iOS 7 y posterior)

En iOS 6, una aplicación que entra en primer plano necesita tiempo para cargar nuevos contenidos, presentando brevemente a los usuarios contenidos que ya han visto. La captura en segundo plano permite a las aplicaciones cargar nuevos datos antes de que el usuario inicie la aplicación y ofrecerle el contenido más actualizado.

Para implementar la captura en segundo plano, edite Info.plist y active las casillasHabilitar modos en segundo plano y Captura en segundo plano:

Edit the Info.plist and check the Enable Background Modes and Background Fetch check boxes

A continuación, en AppDelegate, invalide el método FinishedLaunching para establecer el intervalo de captura mínimo. En este ejemplo, se permite que el sistema operativo decida con qué frecuencia capturar contenido nuevo:

public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
  UIApplication.SharedApplication.SetMinimumBackgroundFetchInterval (UIApplication.BackgroundFetchIntervalMinimum);
  return true;
}

Por último, realice la captura reemplazando el método PerformFetch en AppDelegate y pasando un controlador finalización. El controlador de finalización es un delegado que toma un UIBackgroundFetchResult:

public override void PerformFetch (UIApplication application, Action<UIBackgroundFetchResult> completionHandler)
{
  // Check for new data, and display it
  ...
  
  // Inform system of fetch results
  completionHandler (UIBackgroundFetchResult.NewData);
}

Cuando hayamos terminado de actualizar el contenido, se informará al sistema operativo mediante una llamada al controlador de finalización con el estado adecuado. iOS ofrece tres opciones para el estado del controlador de finalización:

  1. UIBackgroundFetchResult.NewData : se llama cuando se ha capturado el nuevo contenido y se ha actualizado la aplicación.
  2. UIBackgroundFetchResult.NoData : se llama cuando se realiza la captura de contenido nuevo, pero no hay contenido disponible.
  3. UIBackgroundFetchResult.Failed : útil para el control de errores, se llama cuando la captura no pudo pasar.

Las aplicaciones que usan captura en segundo plano pueden realizar llamadas para actualizar la interfaz de usuario desde segundo plano. Cuando el usuario abra la aplicación, la interfaz de usuario estará actualizada y mostrará contenido nuevo. Esto también actualizará la instantánea del conmutador de aplicaciones de la aplicación, por lo que el usuario puede ver cuándo la aplicación tiene contenido nuevo.

Importante

Una vez que se llama a PerformFetch, la aplicación tiene aproximadamente 30 segundos para iniciar la descarga de contenido nuevo y llamar al bloque del controlador de finalización. Si esto tarda demasiado tiempo, se finalizará la aplicación. Considere la posibilidad de usar La captura en segundo plano con el Servicio de transferencia en segundo plano al descargar medios u otros archivos grandes.

BackgroundFetchInterval

En el código de ejemplo anterior, dejaremos que el sistema operativo decida con qué frecuencia capturar nuevo contenido estableciendo el intervalo mínimo de captura en BackgroundFetchIntervalMinimum. iOS ofrece tres opciones para el intervalo de captura:

  1. BackgroundFetchIntervalNever : indique al sistema que nunca capture contenido nuevo. Úselo para desactivar la captura en determinadas situaciones, como cuando el usuario no ha iniciado sesión. Este es el valor predeterminado para el intervalo de captura.
  2. BackgroundFetchIntervalMinimum : deje que el sistema decida con qué frecuencia se debe capturar en función de los patrones de usuario, la duración de la batería, el uso de datos y las necesidades de otras aplicaciones.
  3. BackgroundFetchIntervalCustom : si sabe con qué frecuencia se actualiza el contenido de una aplicación, puede especificar un intervalo de suspensión después de cada captura, durante la cual se impedirá que la aplicación capture contenido nuevo. Una vez que ese intervalo esté actualizado, el sistema determinará cuándo capturar contenido.

Tanto BackgroundFetchIntervalMinimum como BackgroundFetchIntervalCustom dependen del sistema para programar capturas. Este intervalo es dinámico, adaptándose a las necesidades del dispositivo, así como a los hábitos del usuario individual. Por ejemplo, si un usuario comprueba una aplicación cada mañana y otro lo hace cada hora, iOS se asegurará de que el contenido esté actualizado para ambos usuarios cada vez que abran la aplicación.

La captura en segundo plano debe usarse para las aplicaciones que se actualizan con frecuencia con contenido no crítico. En el caso de las aplicaciones con actualizaciones críticas, se deben usar las notificaciones remotas. Las notificaciones remotas se basan en captura en segundo plano y comparten el mismo controlador de finalización. Profundizaremos en las notificaciones remotas a continuación.

Notificaciones remotas (iOS 7 y versiones posteriores)

Las notificaciones push son mensajes JSON enviados desde un proveedor a un dispositivo mediante el Servicio de notificaciones push de Apple (APN).

En iOS 6, una notificación push entrante indica al sistema que alerte al usuario de que algo interesante ha ocurrido en una aplicación. Al hacer clic en la notificación se extrae la aplicación del estado suspendido o finalizado, y la aplicación empezaría a actualizar el contenido. iOS 7 (y versiones posteriores) amplía las notificaciones push normales al ofrecer a las aplicaciones la oportunidad de actualizar contenido en segundo plano antes de notificar al usuario, de modo que el usuario pueda abrir la aplicación y presentarse con contenido nuevo inmediatamente.

Para implementar notificaciones remotas, edite Info.plist y active las casillas remotas Habilitar modos en segundo plano y notificaciones:

Background Mode set to Enable Background Modes and Remote notifications

A continuación, establezca la marca content-available en la notificación de inserción en 1. Esto permite que la aplicación sepa capturar contenido nuevo antes de mostrar la alerta:

'aps' {
  'content-available': 1,
  'alert': 'Something new has happened in your app!''
}

EnAppDelegate, invalide el métodoDidReceiveRemoteNotification para comprobar la carga de notificación del contenido disponible y llame al bloque de controlador de finalización adecuado:

public override void DidReceiveRemoteNotification (UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
  if([content-available]) {
    // fetch content
    completionHandler (UIBackgroundFetchResult.NewData);
  }
}

Las notificaciones remotas deben usarse para las actualizaciones poco frecuentes con contenido que es fundamental para la funcionalidad de la aplicación. Para más información sobre las notificaciones remotas, consulte la guía Xamarin Notificaciones push en iOS.

Importante

Dado que el mecanismo de actualización de notificaciones remotas se basa en captura en segundo plano, la aplicación debe iniciar la descarga de contenido nuevo y llamar al bloque del controlador de finalización en un plazo de 30 segundos después de recibir la notificación, o iOS finalizará la aplicación. Considere la posibilidad de emparejar notificaciones remotas con el Servicio de transferencia en segundo plano al descargar medios u otros archivos grandes en segundo plano.

Notificaciones remotas silenciosas

Las notificaciones remotas son una manera sencilla de notificar a las aplicaciones de actualizaciones e iniciar la captura de contenido nuevo, pero hay casos en los que no es necesario notificar al usuario que ha cambiado algo. Por ejemplo, si un usuario marca un archivo para la sincronización, no es necesario notificarlo cada vez que se actualice el archivo. La sincronización de archivos no es un evento sorprendente, ni requiere la atención inmediata del usuario. Los usuarios solo esperan que el archivo esté actualizado cuando lo abran.

En los casos como el anterior, iOS permite enviar notificaciones push de forma silenciosa, es decir, sin una alerta. Para convertir una notificación normal en una silenciosa, basta con quitar la alerta de la carga de notificación:

'aps' {
  'content-available': 1
}

Límites de velocidad

La mayor diferencia entre las notificaciones normales y silenciosas desde la perspectiva del desarrollador es que las inserciones silenciosas son limitadas por velocidad. Las APN retrasarán la entrega de inserciones silenciosas al dispositivo si la velocidad de inserción es demasiado alta. Esto es para asegurarse de que las aplicaciones no purgan los recursos del dispositivo con demasiadas notificaciones silenciosas.

Sin embargo, los APN permitirán que las notificaciones silenciosas "piggyback" junto con una respuesta normal de notificación remota o de mantenimiento activo. Dado que las notificaciones normales no están limitadas a la velocidad, se pueden usar para insertar notificaciones silenciosas almacenadas desde las APN al dispositivo, como se muestra en el diagrama siguiente:

Regular notifications can be used to push stored silent notifications from the APNs to the device, as illustrated by this diagram

Importante

Apple anima a los desarrolladores a enviar notificaciones push silenciosas siempre que la aplicación requiera y permitir que los APN programen su entrega.

En esta sección, hemos tratado las distintas opciones para actualizar el contenido en segundo plano para ejecutar tareas que no se ajustan a una categoría necesaria en segundo plano. Ahora, veamos algunas de estas API en acción.

Siguiente Parte 4: Tutoriales en segundo plano de iOS