What's New in watchOS 3 tareas de fondo

Introducción

Con la próxima actualización de watchOS 3 para todos los dispositivos Apple Watch, el rendimiento de muchas aplicaciones de reloj mejorará significativamente. Esto se debe principalmente a las nuevas formas de ejecución en segundo plano que pueden aprovechar las aplicaciones watchOS para actualizar su contenido periódicamente y tener siempre la información más reciente lista para que la vea el usuario..

En este tutorial, le mostraré cómo puede utilizar las nuevas API de WatchKit en watchOS 3 para que su propia aplicación utilice estas nuevas tareas en segundo plano. Es importante tener en cuenta que, incluso si su aplicación está configurada correctamente para admitir estas actualizaciones en segundo plano, dependiendo de la configuración de un usuario en particular, es posible que el sistema no permita que su aplicación se ejecute en segundo plano..

Este tutorial requiere que esté ejecutando Xcode 8 en OS X El Capitan o posterior.

1. Tareas de fondo

La primera nueva clase importante en watchOS 3 es la WKRefreshBackgroundTask clase. Esta es una clase abstracta que no debes subclasificar o crear instancias de ti mismo. Define una sola propiedad., Información de usuario, que puede almacenar información adicional relacionada con la tarea de fondo. También define un solo método., setTaskCompleted (), que debe llamarse a sí mismo para decirle al sistema que la tarea está completa. Si no llama a esto, el sistema pasará la cantidad máxima de tiempo presupuestado para su aplicación tratando de completar la tarea, lo que a su vez desperdicia la batería y perjudica el rendimiento de otras aplicaciones..

Cuando su aplicación debe manejar una tarea en segundo plano que se está completando, el sistema llamará al delegado de su extensión watchOS encargarse de(_:) método. El único parámetro de este método es un conjunto de WKRefreshBackgroundTask Objetos que necesitas recorrer y procesar en consecuencia.. 

Dentro del marco de WatchKit, Apple proporciona las siguientes cuatro subclases concretas; watchOS pasará su extensión delegado una instancia de la clase apropiada dependiendo de la tarea.

  • WKApplicationRefreshBackgroundTask es un tipo de tarea de fondo general que no está especializado para un tipo de actualización en particular. El caso de uso más común para este tipo es para programar otras tareas. Por ejemplo, puede programar una actualización de fondo para su aplicación a una hora específica del día cada día. Cuando el correspondiente WKApplicationRefreshBackgroundTask objeto se pasa a su delegado de extensión encargarse de(_:) método, puede crear una tarea de red en segundo plano para descargar algunos datos para actualizar el contenido de su aplicación.
  • WKSnapshotRefreshBackgroundTask es un tipo de tarea específicamente para cuando su aplicación necesita actualizar su instantánea. Discutiremos las instantáneas más adelante en este tutorial. Todo lo que necesita saber por ahora es que la instantánea de una aplicación se utiliza como imagen de inicio y también se puede mostrar en el dock del usuario (accesible pulsando el botón lateral). Tenga en cuenta que este tipo de tarea en segundo plano tiene un método único de finalización de tareas que también analizaremos más adelante.
  • WKWatchConnectivityRefreshBackgroundTask es un tipo de tarea para cuando ha transferido datos desde su iPhone a su reloj a través del marco WatchConnectivity. Como este marco proporciona un método para transferir datos de complicaciones directamente al reloj, este tipo de tarea de fondo correspondiente se usa principalmente para programar actualizaciones de instantáneas en respuesta a los datos recibidos desde el iPhone.
  • WKURLSessionRefreshBackgroundTask es un tipo de tarea que se le da a su delegado de extensión cuando se completa una tarea de red en segundo plano. En este escenario, los métodos de delegado que configura para el URLSession los objetos aún se llaman, y es aquí donde necesita trabajar con los datos de manera adecuada. los encargarse de(_:) solo se llama al método de su delegado de extensión para que su aplicación pueda responder a la operación de red que se está completando. los WKURLSessionRefreshBackgroundTask no le da acceso a la URLSession Objeto ni los datos que fueron transferidos. La única propiedad extra que define es una cadena llamada identificador de sesión que puede utilizar para determinar qué proceso de red se ha completado.

Programación de una actualización

Hay varias formas de programar una actualización en segundo plano en watchOS 3. Para una aplicación simple o una actualización de instantáneas, respectivamente, puede usar los siguientes dos métodos en cualquier Extensión de WKE objeto. 

scheduleBackgroundRefresh (withPreferredDate: userInfo: scheduleCompletion :)

Cuando se complete, este método devolverá un WKApplicationRefreshBackgroundTask Objeto a su delegado de extensión. El sistema watchOS intentará activar su extensión en segundo plano a la hora especificada por el Fecha parámetro. 

Tenga en cuenta que no se garantiza que su aplicación se activará en segundo plano en este momento preciso. Debido a otras circunstancias (como la batería restante, otras aplicaciones que se ejecutan y en la memoria, etc.) el sistema puede decidir activar su aplicación en un momento posterior.. 

los Información de usuario Se podrá acceder al parámetro a través de cualquiera de los objetos de tarea en segundo plano pasados ​​a su delegado de extensión. Esto puede ser particularmente útil si necesita enviar información relacionada solo con la actualización actual. Por último, la programadoCompletar el parámetro puede proporcionar un bloque de código que se ejecutará una vez que su actualización haya sido programada o haya fallado debido a algún error.

scheduleSnapshotRefresh (withPreferredDate: userInfo: scheduleCompletion :) 

Este método devolverá un WKSnapshotRefreshBackgroundTask Objeto a su delegado de extensión. Los parámetros para este método son idénticos a cuando se programa una actualización regular de la aplicación. La única diferencia con este método es el tipo de actualización que está programando.

La siguiente es una pieza de código de ejemplo que podría usarse en cualquier parte de su aplicación watchOS para programar una actualización en segundo plano:

WKExtension.shared (). ScheduleBackgroundRefresh (withPreferredDate: Date (timeIntervalSinceNow: 60 * 60), userInfo: nil) (error: ¿Error?) En if let error = error print ("Ocurrió un error al programar una actualización de fondo: \ (error .localizedDescription) ")

Creación de otras tareas de fondo

Como se mencionó anteriormente, un WKWatchConnectivityRefreshBackgroundTask se crea en respuesta al envío de datos al reloj desde su iPhone emparejado a través de las API de WatchConnectivity. 

El último tipo de tarea de fondo, WKURLSessionRefreshBackgroundTask, se programa automáticamente por el sistema cuando creas un URLSession Objeto con una configuración de fondo. Hacer esto desde cualquier lugar dentro de su aplicación de vigilancia hará que el sistema programe automáticamente la solicitud para usted y llame al delegado de su extensión encargarse de(_:) método cuando se completa. El siguiente código de ejemplo contiene dos funciones dentro de una clase de ejemplo. La primera función configura e inicia una tarea de descarga en segundo plano. El segundo es un método delegado declarado en el URLSessionDelegate protocolo.

clase SomeClass: URLSessionDelegate func beginDownloadTask () let config = URLSessionConfiguration.background (withIdentifier: "exampleSessionIdentifier") let session = URLSession (configuración: config, delegate: self, delegateQueue: nil) let task = session.downloadTask (con: (cadena: "http://www.example.com/data")!) task.resume () func urlSession (_ session: URLSession, tarea: URLSessionTask, didCompleteWithError error: ¿Error?) imprimir ("La sesión se completó ")

2. Ver instantáneas de la aplicación

En watchOS 3, las miradas de las aplicaciones se han eliminado por completo del Apple Watch y, en cambio, se han sustituido por las muelle. Se puede acceder a esta base presionando el botón lateral del reloj y contiene cualquier número de aplicaciones que el usuario pueda configurar:

Si su aplicación ha sido colocada en el dock de un usuario, entonces usted es responsable de mantener actualizada la "instantánea" que se muestra en el dock.. 

Se notifica a su aplicación cuando necesita actualizar su instantánea con un WKSnapshotBackgroundRefreshTask siendo pasado a su delegado de extensión encargarse de(_:) método. Cuando reciba esta notificación, además de que su extensión WatchKit se haya activado en segundo plano, el controlador de interfaz raíz de su aplicación también se activará en segundo plano y fuera de la pantalla. En este proceso, los siguientes métodos son llamados en este orden:

  1. El controlador de interfaz raíz despierta (conContexto :) método
  2. El controlador de interfaz raíz willActivate () método
  3. La extensión del delegado encargarse de(_:) método

En cualquier punto de estos tres métodos, puede personalizar la apariencia de la interfaz de su aplicación para crear la instantánea que se muestra en el dock.

El último paso para actualizar la instantánea ocurre en la extensión del delegado encargarse de(_:) método. Al igual que con los otros tipos de tareas en segundo plano, debe informar al sistema que la tarea se ha completado. Sin embargo, para las actualizaciones de instantáneas, esto se hace llamando al setTaskCompleted (restoredDefaultState: estimadoSnapshotExpiration: userInfo :) método en el WKSnapshotBackgroundRefreshTask objeto. Tan pronto como llame a este método, watchOS captura la instantánea de la interfaz actual de su aplicación y la guarda en la memoria hasta la próxima actualización. Para entender mejor este método, analicemos todos sus parámetros:

  • restablecidoDefaultState es solo un valor booleano que especifica si su instantánea es o no del primer controlador de interfaz de su aplicación. Si ha hecho la transición a otra interfaz, entonces pase falso para este valor. 
  • estimadoSnapshotExpiration es un Fecha objeto que especifica cuándo el sistema debe intentar actualizar la instantánea de su aplicación. Si no necesita programar otra actualización inmediatamente, puede pasar a la nueva Date.distantFuture propiedad de clase.
  • Información de usuario es una recopilación de datos personalizados y se pasará a la siguiente WKSnapshotBackgroundRefreshTask Objeto si está programando otra actualización de inmediato.

3. Mejoras a WatchConnectivity

El marco de WatchConnectivity introducido en watchOS 2 y iOS 9 también está adquiriendo nuevas funcionalidades con watchOS 3 y iOS 10.. 

Si un usuario ha puesto la complicación de su aplicación en su esfera del reloj, puede transferir datos del teléfono al reloj hasta 50 veces en un solo día. Esto se hace, como en iOS 9 y watchOS 2, a través de WCSession transferCurrentComplication (userInfo :) método de instancia. Nuevo en watchOS 3 y iOS 10 es el WCSession restanteComplicaciónUserInfoTransfers propiedad, que le dirá cuántas transferencias quedan para ese día.

Otra nueva WCSession propiedad agregada con las actualizaciones de la plataforma de este año es el hasContentPending propiedad, que es solo un valor booleano que indica si hay o no datos por transferir entre el iPhone y Apple Watch.

Si desea obtener más información sobre WatchConnectivity y cómo funciona, puede consultar nuestros tutoriales anteriores que cubren el marco..

  • watchOS 2: Comunicándose con una contraparte

    El lanzamiento de watchOS 2 trae consigo cambios significativos. Uno de esos cambios es la capacidad de comunicarse fácilmente con una contraparte. Existen…
    Jorge costa
    WatchKit
  • watchOS 2: Transferencias de fondo y colas

    Watch Connectivity es un nuevo marco de comunicación lanzado junto con iOS 9 y watchOS 2. Su principal objetivo es transferir de forma fácil y sin problemas ...
    Davis allie
    WatchKit

Conclusión

En general, las nuevas API de watchOS 3 le permiten actualizar de forma rápida y eficiente el contenido de su aplicación Apple Watch en segundo plano. A medida que más aplicaciones adopten estas nuevas API, el rendimiento de las aplicaciones de watchOS en general mejorará enormemente y creará una experiencia de usuario mucho mejor..

El repositorio de GitHub vinculado contiene un proyecto watchOS 3 Xcode con un código de ejemplo que muestra cómo puede programar y responder a las actualizaciones de fondo en sus propias aplicaciones..

Como siempre, asegúrese de dejar sus comentarios y sugerencias en los comentarios a continuación.