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.
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".
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
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..
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".
Haga clic en el archivo "ViewController.h" y edite el siguiente código para cumplir con el GKSessionDelegate
y GKPeerPickerControllerDelegate
protocolos.
@interface ViewController: UIViewController
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.
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.
Sesión
ObjetoUna 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
.
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.
ViewController
recibir datosConfigure 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.
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.
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.
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.
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..