watchOS 2 Comunicándose con una contraparte

Desde el lanzamiento de Apple Watch, los desarrolladores han estado debatiendo y presentando técnicas para superar las limitaciones de watchOS 1. Los desarrolladores se han preguntado, por ejemplo, cómo comunicarse de manera confiable entre una aplicación watchOS y su aplicación iOS principal, y viceversa.

Se han encontrado varias soluciones para resolver este problema, como MMWormhole. Por supuesto, Apple ha sido consciente de las limitaciones de watchOS 1 y el lanzamiento de watchOS 2 resuelve algunas de las limitaciones de watchOS 1. La comunicación entre una aplicación watchOS 2 y su aplicación iOS principal, por ejemplo, se ha vuelto mucho más sencilla gracias a la introducción del marco Watch Connectivity.

Ver conectividad

El marco de Watch Connectivity ofrece varias formas de comunicarse entre un iOS y una aplicación watchOS 2. Con el marco de Watch Connectivity, puede actualizar la información de una contraparte, enviar mensajes, transferir datos en segundo plano e incluso transferir archivos. Para obtener más información sobre todas las características y capacidades del marco, recomiendo consultar la documentación de Apple para el marco de Watch Connectivity..

En este tutorial, te mostraré cómo intercambiar datos entre una aplicación watchOS 2 y su aplicación primaria iOS, y viceversa. La API que usaremos para lograr esto es sendMessage (_: replyHandler: errorHandler :). Este método permite a los desarrolladores transferir datos entre la aplicación watchOS 2 y su aplicación iOS principal..

Es importante tener en cuenta que el iOS y la aplicación watchOS 2 responden de manera diferente cuando sendMessage (_: replyHandler: errorHandler :) se invoca Si la aplicación watchOS 2 invoca este método, el sistema operativo despertará la aplicación iOS. Sin embargo, si envía datos desde la aplicación iOS principal a la aplicación watchOS 2, esta última no se activará. Este es un detalle importante a tener en cuenta..

Prerrequisitos

Dado que este tutorial trata sobre el desarrollo de Apple Watch, asumo que ya está familiarizado con el desarrollo de iOS y el lenguaje de programación Swift. El marco de Watch Connectivity solo está disponible en watchOS 2, lo que significa que necesita tener instalada la última versión de Xcode, Xcode 7. Puede descargar Xcode del sitio web del desarrollador de Apple.

1. Configuración del proyecto

Abierto Xcode y seleccione Nuevo> Proyecto ...  desde el Expediente menú. Ir watchOS> Aplicación, Selecciona el Aplicación iOS con la aplicación WatchKit plantilla de proyecto y haga clic Siguiente. Nombra tu aplicación SendMessageWatch, conjunto Idioma a Rápido, y Dispositivos a iPhone. Desmarcar Incluir escena de notificación y asegúrese de que todas las casillas de verificación de la parte inferior no estén marcadas. Golpear Siguiente y elige una ubicación para guardar tu proyecto.

2. Creando la interfaz de usuario

En este paso, agregaremos una etiqueta y un botón a ambas aplicaciones. La etiqueta se usará para mostrar los mensajes que estamos enviando, mientras que el botón enviará el mensaje a la contraparte, a la aplicación iOS o a la aplicación watchOS 2..

Comenzaremos con la aplicación iOS. Abierto Main.storyboard y añadir una etiqueta y un botón. A continuación, cree una salida para los dos elementos de la interfaz de usuario y agregue una acción para el botón. La siguiente captura de pantalla muestra el resultado..

Centrémonos ahora en la aplicación watchOS 2. Abierto Interface.storyboard y agregar una etiqueta y un botón a la escena. A continuación, abrir InterfaceController.swift en el Editor asistente y cree una salida para la etiqueta y el botón, y agregue una acción para el botón.

Con la interfaz de usuario instalada, es hora de ampliar el tema principal de este tutorial, enviar mensajes desde la aplicación iOS a la aplicación watchOS 2 y viceversa.

3. Usando el marco de conectividad del reloj

El uso del marco Watch Connectivity para intercambiar mensajes requiere el uso del WCSession clase. Para que esto funcione, tanto la aplicación iOS como la aplicación watchOS 2 deben crear y configurar un WCSession ejemplo. Cuando la sesión está configurada, podemos comunicarnos inmediatamente de un lado a otro..

clase InterfaceController: WKInterfaceController, WCSessionDelegate var session: WCSession!…

Obtenemos una instancia de la WCSession clase llamando al defaultSession método de clase. Esto devuelve el objeto de sesión singleton para el dispositivo. Luego necesitamos configurar el delegado de la sesión y activar la sesión..

Antes de configurar y utilizar el WCSession objeto, tenemos que verificar que la WCSession clase es compatible con el dispositivo. Hacemos esto llamando al esta apoyado método de clase en el WCSession clase. Hacemos todo esto en el se activará método de la Controlador de interfaz clase. Tenga en cuenta que activar sesión lanzará una excepción si el delegado de la sesión es nulo. En otras palabras, el orden de las siguientes afirmaciones es importante.

anular func willActivate () super.willActivate () if (WCSession.isSopported ()) session = WCSession.defaultSession () session.delegate = self session.activateSession ()

La aplicación watchOS 2 ahora puede enviar y recibir mensajes. Con la sesión activada, solo necesitamos invocar el sendMessage (_: replyHandler: errorHandler :) Método para enviar mensajes. El primer argumento debe ser un diccionario de tipo. [String: AnyObject] y no debería ser nulo.

los responder Handler Es un cierre que acepta un diccionario del mismo tipo. Este diccionario es la respuesta de la contraparte. los errorHandler También es un cierre, que puede ser nulo Si no necesitas atrapar ningún error..

Si presionamos el botón de enviar en el Apple Watch, inmediatamente enviará un Hola iphone mensaje y el iPhone responderá con una Hola reloj mensaje. Después de presionar el botón de enviar en el iPhone, enviará una pregunta. Hola mira me puedes hablar? y el Apple Watch responderá con .

Esto es lo que la implementación de la enviar mensaje El método debería verse como en InterfaceController.swift.

@IBAction func sendMessage () let messageToSend = ["Value": "Hello iPhone"] session.sendMessage (messageToSend, replyHandler: replyMessage en // manejamos y presentamos el mensaje en pantalla let value = replyMessage ["Value"] as ? String self.messageLabel.setText (value), errorHandler: error en // captura cualquier error aquí imprime (error))

Para manejar el mensaje en el dispositivo iOS, necesitamos implementar el sesión (_: didReceiveMessage :) método delegado del WCSessionDelegate protocolo, que se invoca cuando la contraparte recibe un mensaje. Así es como se ve la implementación en Controlador de interfaz.rápido.

func session (session: WCSession, didReceiveMessage message: [String: AnyObject], replyHandler: ([String: AnyObject]) -> Void) // manejar el mensaje recibido let value = message ["Value"] as? Cadena // Use esto para presentar inmediatamente en la pantalla dispatch_async (dispatch_get_main_queue ()) self.messageLabel.setText (value) // enviar una respuesta replyHandler (["Value": "Yes"])

La implementación de ambos métodos es muy similar para la aplicación iOS. Con las implementaciones anteriores, pruébelo implementando el enviar mensaje y sesión (_: didReceiveMessage: replyHandler :) metodos Esto es lo que la implementación de la ViewController la clase debe parecer.

importar UIKit importar clase WatchConnectivity ViewController: UIViewController, WCSessionDelegate var session: WCSession! @IBOutlet var messageLabel: UILabel! @IBOutlet var sendButton: UIButton! @IBAction func sendMessage (sender: AnyObject) // Enviar mensaje a WatchKit let messageToSend = ["Value": "Hola, ¿me puedes hablar?"] Session.sendMessage (messageToSend, replyHandler: replyMessage in // handle la respuesta let value = replyMessage ["Value"] as? String // usa dispatch_asynch para presentar inmediatamente en la pantalla dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = value, errorHandler: error en // captura cualquier error aquí imprimir (error)) anular func viewDidLoad () super.viewDidLoad () // Haga cualquier configuración adicional después de cargar la vista, generalmente desde una plumilla. if (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = self; session.activateSession () anula la función didReceiveMemoryWarning () super.didReceiveMemoryWarning () // Deseche todos los recursos que puedan recrearse.  // Sesión de función Swift (sesión: WCSession, didReceiveMessage message: [String: AnyObject], replyHandler: ([String: AnyObject]) -> Void) // manejar el mensaje recibido let value = message ["Value"] as? String dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = value // enviar una respuesta replyHandler (["Value": "Hello Watch"])

Crea y ejecuta las aplicaciones para ver el resultado final. Cuando toca el botón en Apple Watch, debería aparecer un mensaje en el iPhone emparejado que ejecuta la aplicación iOS. Cuando toca el botón de la aplicación iOS, debería aparecer un mensaje en el Apple Watch ejecutando la aplicación watchOS 2.

4. Explorando el WCSessionDelegate Protocolo

El método de delegado que implementamos para recibir el mensaje tiene un hermano más simple, sesión (_: didReceiveMessage :). Este método se llama cuando sendMessage (_: replyHandler: errorHandler :) Se invoca sin un controlador de respuesta. Esto simplemente indica que la aplicación que envía el mensaje no espera una respuesta..

Además de enviar un diccionario a una contraparte, también es posible enviar un NSData objeto usando el sendMessageData (_: replyHandler: errorHandler :) método. La contraparte recibe el mensaje a través del sesión (_: didReceiveMessageData :) y sesión (_: didReceiveMessageData: replyHandler :) delegar métodos de la WCSessionDelegate protocolo.

Conclusión

Si necesita comunicarse inmediatamente con una contraparte, entonces el marco de Watch Connectivity es la mejor opción en watchOS 2. Los mensajes se ponen en cola y se entregan en el mismo orden en que se enviaron..

El marco de Watch Connectivity tiene mucho más que ofrecer que lo que se trata en este tutorial. En futuros tutoriales, profundizaremos en este nuevo marco para explorar más a fondo sus características y capacidades.