Conectividad Bluetooth con GameKit

Este tutorial de iOS le enseñará cómo establecer una conexión Bluetooth entre dos dispositivos iOS usando el GKPeerPickerController, GKPeerPickerControllerDelegate, Sesión, y GKSessionDelegate clases También cubriremos cómo enviar datos de ida y vuelta a través de la conexión mediante la creación de una aplicación de mensajes de texto simple.


Paso 1: Configuración del proyecto

Inicia Xcode y haz click Archivo> Nuevo> Proyecto. Haga clic en "Aplicación" en el panel de iOS a la izquierda. Haga clic en el icono "Aplicación de vista única" y haga clic en "Siguiente".

En el campo "Nombre del producto", escriba "BluetoothTextMessenger" e ingrese un nombre para su Identificador de empresa, como "com.mobiletuts". Elija "iPhone" en el menú "Familia de dispositivos". Desmarque "Usar guiones gráficos" e "Incluir pruebas unitarias" y luego marque "Usar conteo automático de referencias". Haga clic en "Siguiente", elija una ubicación para guardar su proyecto y luego haga clic en "Crear".


Paso 2: Declarar los métodos

Comencemos por declarar y definir los métodos para conectarse a un dispositivo y enviar datos. En el archivo "ViewController.m", agregue el siguiente código:

 @interface ViewController () - (void) sendMessage: (id) sender; - (void) connectToDevice: (id) remitente; @end - (void) connectToDevice: (id) sender  - (void) sendMessage: (id) sender 

Paso 3: Configuración de la interfaz

Vamos a crear dos botones, una etiqueta y un campo de texto para nuestro mensajero de texto. Haga clic en el archivo "ViewController.h" y agregue el siguiente código:

 @property (strong, nonatomic) UILabel * messageReceivedLabel; @property (strong, nonatomic) UITextField * messageToSendTextField; Sesión GKSession * de propiedad (fuerte, no atómica); @property (strong, nonatomic) UIButton * sendButton;

Haga clic en el archivo "ViewController.m" y agregue el siguiente código para completar las propiedades.

 @synthesize messageReceivedLabel = _messageReceivedLabel; @synthesize messageToSendTextField = _messageToSendTextField; sesión @synthesize = _session; @synthesize sendButton = _sendButton;

Mientras se encuentre dentro del archivo "ViewController.m", agregue el siguiente código para crear la interfaz mediante programación:

 // Botón para conectarse a otro dispositivo UIButton * connectButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; connectButton.frame = CGRectMake (20.0f, 20.0f, 80.0f, 40.0f); [connectButton setTitle: @ "Connect" forState: UIControlStateNormal]; connectButton.tintColor = [UIColor darkGrayColor]; [connectButton addTarget: self action: @selector (connectToDevice :) forControlEvents: UIControlEventTouchUpInside]; [self.view addSubview: connectButton]; // Botón para enviar mensaje a otro dispositivo UIButton * sendButton_ = [UIButton buttonWithType: UIButtonTypeRoundedRect]; sendButton_.frame = CGRectMake (220.0f, 20.0f, 80.0f, 40.0f); [sendButton_ setTitle: @ "Send" forState: UIControlStateNormal]; sendButton_.tintColor = [UIColor darkGrayColor]; sendButton_.enabled = NO; [sendButton_ addTarget: self action: @selector (sendMessage :) forControlEvents: UIControlEventTouchUpInside]; self.sendButton = sendButton_; [self.view addSubview: self.sendButton]; // Etiqueta para el mensaje que se recibe self.messageReceivedLabel = nil; CGRect messageReceivedLabel_Frame = CGRectMake (20.0f, 80.0f, 280.0f, 44.0f); UILabel * messageReceivedLabel_ = [[UILabel alloc] initWithFrame: messageReceivedLabel_Frame]; messageReceivedLabel_.textAlignment = UITextAlignmentCenter; messageReceivedLabel_.font = [UIFont boldSystemFontOfSize: 20.0f]; self.messageReceivedLabel = messageReceivedLabel_; [self.view addSubview: self.messageReceivedLabel]; // Campo de texto al mensaje de entrada para enviar CGRect messageToSendTextField_Frame = CGRectMake (20.0f, 144.0f, 280.0f, 44.0f); UITextField * messageToSendTextField_ = [[UITextField alloc] initWithFrame: messageToSendTextField_Frame]; messageToSendTextField_.font = [UIFont systemFontOfSize: 20.0f]; messageToSendTextField_.backgroundColor = [UIColor whiteColor]; messageToSendTextField_.clearButtonMode = UITextFieldViewModeAlways; messageToSendTextField_.placeholder = @ "Ingrese un mensaje para enviar"; messageToSendTextField_.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; self.messageToSendTextField = messageToSendTextField_; [self.view addSubview: self.messageToSendTextField];

Los dos botones inician la conexión y envían un mensaje de texto, mientras que el campo de texto contiene el mensaje saliente y la etiqueta muestra el mensaje entrante..


Paso 4: Agregar el marco

GameKit proporciona una manera fácil de conectarse a través de Bluetooth. Utilizando GKPeerPickerControllerDelegate y GKSessionDelegate, El delegado se encarga automáticamente de las complejidades de la conexión, como las ventanas para mostrar las conexiones y quién está cerca. Comience importando el framework "GameKit". Haga clic en el objetivo de la aplicación, el archivo Xcode que aparece en la parte superior del panel del extremo izquierdo. Desplácese hacia abajo hasta el panel "Marcos y bibliotecas vinculados". Haga clic en el botón más y escriba "GameKit". Haga clic en "GameKit.framework" y luego haga clic en "Agregar".


Paso 5: Cumplir con los delegados

Haga clic en el archivo "ViewController.h" y edite el siguiente código para cumplir con el GKSessionDelegate y GKPeerPickerControllerDelegate protocolos.

 @interface ViewController: UIViewController 

Paso 6: Agregar la lógica de conexión

Las dos clases realizan diferentes tareas relacionadas con una conexión.. GKPeerPickerController proporciona una interfaz para establecer la conexión entre dos dispositivos, luego proporciona una Sesión Objeto como resultado de la conexión. los Sesión luego el objeto maneja la conexión y los datos que se pasan, según la configuración de su aplicación.

Establecer una conexión

Añadamos la lógica en el orden en que ocurre. Primero, crearemos una conexión usando GKPeerPickerController. Navegue de nuevo al método previamente definido connectToDevice: y agregue la siguiente lógica dentro de las llaves para intentar conectarse a un dispositivo cuando se toca el botón de conexión.

 if (self.session == nil) // crear selector de pares y mostrar selector de conexiones GKPeerPickerController * peerPicker = [[GKPeerPickerController alloc] init]; peerPicker.delegate = self; peerPicker.connectionTypesMask = GKPeerPickerConnectionTypeNearby; [peerPicker show]; 

En el código anterior, verificamos que no haya sesión, lo que significa que el dispositivo no está conectado. Si no hay sesión, un GKPeerPickerController se crea y el ViewController se asigna como delegado para que pueda implementar el GKPeerPickerControllerDelegate metodos Por último, la GKPeerPickerController aparece en la pantalla con una lista de conexiones Bluetooth cercanas disponibles.

Conseguir el Sesión Objeto

Una vez el peerPicker Se muestra, se llama una serie de métodos de delegado que manejan la conexión. Mientras se encuentre en el archivo "ViewController.m", agregue el siguiente código:

 - (GKSession *) peerPickerController: (GKPeerPickerController *) picker sessionForConnectionType: (GKPeerPickerConnectionType) escriba // crear ID para la sesión NSString * sessionIDString = @ "MTBluetoothSessionID"; // crear un objeto GKSession GKSession * session = [[GKSession alloc] initWithSessionID: sessionIDString Quint: nil sessionMode: GKSessionModePeer]; sesión de retorno; 

Este método de delegado obtiene una sesión basada en el tipo de conexión especificado. En este caso, GKSessionModePeer se usa porque queremos buscar dispositivos de conexión como un cliente y anunciar la conexión como un servidor. los ID de sesión Es necesario identificar la sesión y puede ser cualquier valor que se adapte a sus necesidades. El retorno Sesión usa el ID de sesión como su identificador, y los nuevos pares pueden usar el identificador para conectarse al mismo Sesión.

Despidiendo al recogedor

A continuación, querrá implementar peerPickerController: didConnectPeer: toSession: para tomar el control de la sesión y descartar el selector. Escriba el siguiente código en el archivo "ViewController.m".

 - (void) peerPickerController: (GKPeerPickerController *) picker didConnectPeer: (NSString *) peerID toSession: (GKSession *) session // configurar el delegado de sesión y descartar el selector session.delegate = self; self.session = sesión; picker.delegate = nil; [despido del recogedor]; 

El delegado de sesión está configurado para yo de manera que la ViewController puede implementar el GKSessionDelegate metodos Entonces el ViewController se elimina como delegado del selector, y el selector se despide ya que ya no es necesario.

Selecciona el ViewController recibir datos

Configure el objeto ViewController para recibir datos de sus pares agregando el siguiente código.

 - (void) session: (GKSession *) par de sesión: (NSString *) peerID didChangeState: (GKPeerConnectionState) state if (state == GKPeerStateConnected) [session setDataReceiveHandler: self withContext: nil]; // configura ViewController para recibir datos self.sendButton.enabled = YES; // habilitar el botón de envío cuando la sesión está conectada else self.sendButton.enabled = NO; // deshabilitar el botón de envío si la sesión está desconectada self.session.delegate = nil; self.session = nil; // permitir que la sesión vuelva a conectarse si se desconecta

Cada vez que cambia el estado de la conexión, se llama a este método delegado. En el código, verificamos si la sesión está conectada y, si lo está, el ViewController está configurado para manejar los datos recibidos de compañeros conectados a la sesión. Si la sesión no está conectada, el delegado y la sesión se configuran en nil para que se pueda establecer otra conexión.

Enviando datos

Para enviar el contenido del campo de texto al dispositivo que está conectado, vuelva al método definido anteriormente. enviar mensaje: y agrega el siguiente código dentro de las llaves.

 // texto del campo de texto del paquete como NSData objeto NSData * textData = [self.messageToSendTextField.text dataUsingEncoding: NSASCIIStringEncoding]; // enviar datos a todos los dispositivos conectados [self.session sendDataToAllPeers: textData withDataMode: GKSendDataReliable error: nil];

La primera línea empaqueta el texto del campo de texto como un NSData Objeto para que pueda ser enviado a través de bluetooth. La segunda línea le dice a la sesión que envíe los datos a todos los compañeros conectados a la sesión.

Recibiendo información

Los datos recibidos de un par vienen en forma de NSData objeto. Para descomprimir el texto, agregue el siguiente código:

 - (void) receiveData: (NSData *) data fromPeer: (NSString *) peer inSession: (GKSession *) contexto de sesión: (void *) context // desempaquetar NSData en NSString y establece el texto entrante como texto de etiqueta NSString * completedString = [ [NSString alloc] initWithData: codificación de datos: NSASCIIStringEncoding]; self.messageReceivedLabel.text = allowedString; 

La primera línea de código en este método desempaqueta la NSData objeto, devolviendo un NSString objeto. A continuación, la propiedad de texto de la etiqueta se establece como la cadena entrante.


Paso 7: Probando la conexión

Conecte un dispositivo a su computadora. Hacer clic Producto> Ejecutar, o la flecha Ejecutar en la esquina superior izquierda, para compilar y ejecutar la aplicación en un dispositivo. Una vez que la aplicación se ejecute en un dispositivo, desconéctela y conecte un segundo dispositivo a su computadora. Crea y ejecuta la aplicación en este dispositivo también. Inicie la aplicación en ambos dispositivos. Toque el botón de conexión en ambos dispositivos y siga las indicaciones para conectar sus dispositivos. Escribe un mensaje y presiona "Enviar" para verlo aparecer en el otro dispositivo.


Conclusión

Una cosa a tener en cuenta es que la conexión Bluetooth está diseñada para enviar pequeños bits de datos, como texto o un conjunto de números. Si está planeando enviar algo grande como una foto, probablemente querrá usar Wi-Fi o una conexión a Internet. Si bien es probable que esta aplicación no permita que descargues tu mensajero de texto favorito, muestra cómo conectar y enviar bits de datos a través de Bluetooth, una característica útil para cualquier aplicación que podría beneficiarse de compartir pequeños fragmentos de datos entre dispositivos..