watchOS 2 Transferencias de fondo y colas

Introducción

Watch Connectivity es un nuevo marco de comunicación lanzado junto con iOS 9 y watchOS 2. Su propósito principal es transferir información de manera fácil y sin problemas entre una aplicación Apple Watch y su aplicación iOS principal..

El marco proporciona muchas funcionalidades diferentes. Hace unas semanas, Jorge Costa escribió sobre la capacidad de enviar mensajes entre un iOS y una aplicación de Apple Watch. En este tutorial, ampliaremos la transferencia de datos en segundo plano..

La capacidad de enviar mensajes está diseñada para los datos que el otro dispositivo necesita inmediatamente. En contraste, las transferencias de fondo son más adecuadas para grandes cantidades de datos que la contraparte no necesita de forma inmediata. Una excepción a esto es la información sobre complicaciones, que veremos más adelante en este tutorial..

Prerrequisitos

Este tutorial requiere que esté ejecutando Xcode 7 en OS X 10.10 o posterior. También deberá descargar el proyecto de inicio de GitHub..

1. Configuración del marco

Para utilizar el marco de Watch Connectivity, tanto su aplicación iOS como su aplicación watchOS necesitan tener una clase que se ajuste a la WCSessionDelegate protocolo y que configura correctamente el predeterminado WCSession. Los métodos de la WCSessionDelegate El protocolo maneja la recepción de todos los datos a través del marco de Watch Connectivity y le permite tomar el control de los nuevos datos en su aplicación..

Abre el proyecto de inicio en Xcode y edita. AppDelegate.swift. En la parte superior, agregue lo siguiente importar declaración:

importar WatchConnectivity

A continuación, actualice la definición de clase del AppDelegate clase para que se ajuste a la WCSessionDelegate protocolo.

clase AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate 

También declaramos una propiedad de tipo. WCSession! en el AppDelegate clase para almacenar una referencia a la predeterminada WCSession objeto.

sesión de var: WCSession!

Finalmente, actualice el aplicación (_: didFinishLaunchingWithOptions :) método como se muestra a continuación.

func application (aplicación: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool session = WCSession.defaultSession () session.delegate = self si WCSession.isSupported () session.activateSession ()) return true

En aplicación (_: didFinishLaunchingWithOptions :), obtenemos una referencia a la predeterminada WCSession objeto, establezca el delegado de la sesión a su aplicación AppDelegate instancia y, si es compatible, activar la sesión. los esta apoyado el método de clase comprueba si la aplicación watchOS de su aplicación iOS está instalada o no en un Apple Watch emparejado y puede enviar datos.

La configuración para el lado watchOS es muy similar. Abierto ExtensionDelegate.swift y reemplazar su contenido con lo siguiente:

Importe WatchKit Importe la clase WatchConnectivity ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate var session: WCSession! func applicationDidFinishLaunching () session = WCSession.defaultSession () session.delegate = self session.activateSession () func applicationDidBecomeActive ()  func applicationWillResignActive () 

Notarás que no llamamos esta apoyado sobre el WCSession Clase antes de activar la sesión. Esto es porque este método siempre devuelve cierto en el lado de watchOS.

Para comprobar que todo funciona correctamente, ejecute su aplicación Apple Watch en cualquiera de los dos simuladores como se muestra a continuación.

A continuación, ejecute su aplicación iOS en el mismo tipo de simulador de iPhone que seleccionó al ejecutar la aplicación watch.

Una vez que se haya lanzado su aplicación iOS, su simulador de Apple Watch debería volver a la esfera del reloj como se muestra en la siguiente captura de pantalla..

2. Enviando datos

Con el predeterminado WCSession objeto configurado correctamente, es hora de que enviemos algunos datos entre el iOS y la aplicación Apple Watch.

Abierto TableViewController.swift y agregue la siguiente línea de código al final de la createNewItem (_ :) método:

WCSession.defaultSession (). TransferUserInfo (elemento)

los transferUserInfo (_ :) El método acepta un diccionario como único parámetro. Una vez que se ha llamado a este método, el diccionario de información del usuario que proporcionó se agrega a la cola de información a transferir..

Tanto iOS como watchOS trabajan en conjunto para transferir la información en un momento oportuno. El sistema combinado analiza el uso de la aplicación, la vida útil de la batería, si el otro dispositivo se está utilizando o no, etc. Una vez que el sistema ha transferido la información, la aplicación en el otro dispositivo ejecutará un método de devolución de llamada de delegado la próxima vez que es lanzado.

Ahora es el momento de que implementemos el lado receptor en el Apple Watch. Abierto ExtensionDelegate.swift y agrega el siguiente método a la ExtensionDelegate clase:

func session (session: WCSession, didReceiveUserInfo userInfo: [String: AnyObject]) dispatch_async (dispatch_get_main_queue ()) () -> No válido si los ítems = NSUserDefaults.standardUserDefaults (). objectForKey ("items")? [NSDictionary] var newItems = ítems newItems.append (userInfo) NSUserDefaults.standardUserDefaults (). SetObject (newItems como AnyObject, por ejemplo: b....OOOO O new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new new : "artículos")   

Este método se llamará tan pronto como ejecutemos la aplicación Apple Watch y una vez que la información se haya transferido correctamente..

Tenga en cuenta que si bien este tutorial solo muestra un ejemplo de transferencia de información de iOS a watchOS, WCSessionWCSessionDelegate Los métodos se comportan exactamente igual en ambas plataformas para transferencias en segundo plano..

Con este código implementado, ejecute su aplicación Apple Watch en el simulador. A continuación, vuelva a ejecutar la aplicación para iPhone y presione el botón para crear un nuevo elemento..

Ahora vuelve al simulador de Apple Watch y presiona Comando-Shift-H Dos veces para volver a la aplicación más reciente. Verá que el elemento que acaba de crear aparece en el Apple Watch..

Tenga en cuenta que, si bien la transferencia de información se realizó inmediatamente entre los simuladores, en una situación real con dispositivos físicos, no siempre será así..

3. Accediendo a la cola de transferencia pendiente

Con la aplicación iOS aún en ejecución, salga del simulador de Apple Watch desde la barra de menú o presione Comando-Q. Después de hacer esto, presione el botón en su aplicación de iOS para crear algunos elementos más como se muestra a continuación.

Cuando intenta transferir información mediante el marco de Watch Connectivity, se agrega a una cola que se borra gradualmente a medida que se transfiere la información. Se puede acceder a esta cola y también a las transferencias en la cola..

Esto es útil, porque puede ver cuántos artículos aún están pendientes e incluso puede cancelar transferencias específicas si lo necesita. Los elementos que acaba de crear se encuentran actualmente en la cola de información del usuario porque Apple Watch está actualmente desconectado del dispositivo principal, lo que hace imposible una transferencia.

Abierto AppDelegate.swift y agregue el siguiente código al final de aplicación (_: didFinishLaunchingWithOptions :):

let transfers = session.outstandingUserInfoTransfers si transfers.count> 0 let transfer = transfers.first! transferencia.cancelar ()

Con este código, accedemos a las transferencias de información de usuario pendientes y, si hay al menos una, cancelamos la primera transferencia. los WCSessionUserInfoTransfer objetos devueltos desde el destacadoUserInfoTransfers La propiedad también tiene dos propiedades de solo lectura a las que puede acceder:

  • Información de usuario: Esta propiedad almacena el diccionario que está transfiriendo..
  • transfiriendo: Esta propiedad almacena un valor booleano e indica si la información del usuario se está transfiriendo actualmente.

No hay una gran cantidad de funciones disponibles con transferencias de información sobresalientes en el marco de Watch Connectivity, pero dependiendo de su aplicación, algunas de estas características pueden ser muy útiles..

4. Otros métodos de transferencia

En este tutorial, solo hemos cubierto las transferencias de fondo de información del usuario, pero hay algunas otras formas de transferir datos entre dispositivos. Cada uno de estos métodos está diseñado para un propósito específico cuando se comunica entre un iPhone y un Apple Watch..

Contexto de aplicación

Aquí es donde necesita transferir información entre dispositivos donde solo la información más reciente es relevante. Transfieres un solo diccionario llamando al updateApplicationContext (_: error :) método. los error parámetro en este método es un puntero a una NSError objeto, que se llenará con información si ocurre un problema con la transferencia.

En el lado receptor puede implementar el sesión (_: didReceiveApplicationContext :) método o, alternativamente, acceder al contexto de la aplicación a través del valor predeterminado WCSession objetos recibidoAplicaciónContexto propiedad.

Información de Complicación

Aquí es donde debe transferir un diccionario de información de un solo usuario específicamente para la complicación personalizada de su aplicación. Solo puede enviar información desde el lado de iOS y esto se hace con la transferCurrentComplicationUserInfo (_ :) método.

La diferencia clave entre esto y el transferUserInfo (_ :) El método utilizado anteriormente en este tutorial es que, al actualizar una complicación, el sistema siempre intentará transferir la información inmediatamente..

Tenga en cuenta que no se garantiza una transferencia, ya que los dispositivos se pueden desconectar o su complicación puede haber excedido su presupuesto de ejecución de fondo. Si no se puede completar una transferencia de información de complicación, se agrega a la destacadoUserInfoTransfers cola donde se puede ver y cancelar si es necesario.

También tenga en cuenta que, si hay una transferencia de información de complicación en la cola y usted llama al transferCurrentComplicationUserInfo (_ :) Método de nuevo, la transferencia existente en la cola se invalidará y se cancelará.

Archivos

Incluso puede utilizar el marco de Watch Connectivity para transferir archivos entre dispositivos. Esto se hace a través de la transferFile (_: metaData :) Método donde el primer parámetro es un local. NSURL al archivo y el segundo es un diccionario opcional, que contiene datos adicionales asociados con ese archivo.

Como era de esperar, la recepción de este archivo se maneja mediante un método del WCSessionDelegate protocolo, el sesión (_: didReceiveFile :) Método para ser precisos. En este método, se le da una sola WCSessionFile objeto que contiene una nueva URL local para el archivo real, así como los metadatos que transfirió.

Al igual que con las transferencias de información del usuario, también puede ver transferencias pendientes o de archivos que están en curso a través de la configuración predeterminada. WCSession objetos Transferencias de archivos pendientes propiedad.

Conclusión

En general, el marco de Watch Connectivity proporciona una interfaz muy simple y fácil de usar para transferir datos entre un iPhone conectado y un Apple Watch. El marco permite la transferencia de la información del usuario, el contexto de la aplicación y los diccionarios de información de complicaciones, así como los archivos..

Ahora debe sentirse cómodo con el envío y la recepción de información mediante el marco de Watch Connectivity y con la forma en que puede interactuar con cualquier transferencia pendiente..

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