La API de Nearby Messages es una API de publicación y suscripción que permite que los dispositivos pueden intercambiar cargas útiles de datos. Cuando un dispositivo publica un mensaje, los dispositivos pueden recibir el mensaje. El tamaño del mensaje debe ser relativamente pequeño para mantener un buen rendimiento. Este servicio no está diseñado para intercambiar objetos tales como fotos y videos.
El conjunto de dispositivos cercanos está determinado por el intercambio de pequeños tokens en Bluetooth y audio casi ultrasónico (Inaudible) Cuando un dispositivo detecta un token de un dispositivo cercano, envía el token al servidor de Nearby Messages para validarlo y comprobar si hay mensajes para entregar conjunto actual de suscripciones.
Una aplicación puede controlar el conjunto de medios usados para descubrir dispositivos si los medios se usan para transmitir tokens o buscar tokens. De forma predeterminada, la transmisión y la búsqueda se realizan en todos los medios. Tareas pendientes el descubrimiento en un subconjunto o medios, y para controlar si transmitir o buscar debes pasar parámetros adicionales cuando crees publicaciones y suscripciones.
Esta biblioteca se ejecuta en iOS 7 y versiones posteriores, y se compila con el SDK de iOS 8.
Cómo crear un administrador de mensajes
Este código crea un objeto de administrador de mensajes, lo que te permite publicar y se suscriban. El intercambio de mensajes no está autenticado, por lo que debes proporcionar un clave de API pública para iOS. Puedes crear una mediante la entrada de Google Developers Console para tu proyecto.
Objective-C
#import <GNSMessages.h>
GNSMessageManager *messageManager =
[[GNSMessageManager alloc] initWithAPIKey:@"API_KEY"];
Swift
let messageManager = GNSMessageManager(APIKey: "API_KEY")
Publica un mensaje
Este fragmento de código muestra la publicación de un mensaje que contiene un nombre. La publicación estará activa mientras exista el objeto de publicación. Para detener publicación, libera el objeto de publicación.
Objective-C
id<GNSPublication> publication =
[messageManager publicationWithMessage:[GNSMessage messageWithContent:[name dataUsingEncoding:NSUTF8StringEncoding]]];
Swift
let publication =
messageManager.publication(with: GNSMessage(content: name.data(using: .utf8)))
Suscripción a mensajes
Este fragmento de código demuestra la suscripción a todos los nombres compartidos por el fragmento de la publicación anterior. La suscripción estará activa mientras el que existan los objetos de suscripción. Para detener la suscripción, suéltala .
Se llama al controlador de mensajes encontrados cuando hay dispositivos cercanos que están publicando contenido. el descubrimiento de los mensajes. Se llama al controlador de mensajes perdidos cuando un mensaje no tiene estado. se observó durante más tiempo (el dispositivo está fuera del alcance o ya no publica el mensaje).
Objective-C
id<GNSSubscription> subscription =
[messageManager subscriptionWithMessageFoundHandler:^(GNSMessage *message) {
// Add the name to a list for display
}
messageLostHandler:^(GNSMessage *message) {
// Remove the name from the list
}];
Swift
let subscription =
messageManager.subscription(messageFoundHandler: { (message: GNSMessage?) in
// Add the name to a list for display
},
messageLostHandler: { (message: GNSMessage?) in
// Remove the name from the list
})
Medios de descubrimiento
De forma predeterminada, se utilizarán ambos medios (audio y Bluetooth) para detectar dispositivos cercanos.
ambos medios transmitirán y buscarán. En algunos casos,
Se requiere para agregar las siguientes entradas al Info.plist
de tu app:
Si tu app escanea con audio, agrega
NSMicrophoneUsageDescription
, que es un cadena que describe por qué vas a utilizar el micrófono. Por ejemplo, “El el micrófono detecta tokens anónimos de dispositivos cercanos."Si tu app transmite con BLE, agrega
NSBluetoothPeripheralUsageDescription
, que es una cadena que describe por qué publicará anuncios en BLE. Por ejemplo, “Se anuncia un token anónimo mediante Bluetooth para descubrir dispositivos cercanos".
En algunos casos, es posible que tu app necesite usar solo uno de los medios tal vez no necesite realizar transmisiones y buscar en ese medio.
Por ejemplo, una aplicación diseñada para conectarse a un decodificador transmitir en audio solo necesita buscar en el audio para descubrirlo. Lo siguiente fragmento muestra cómo publicar un mensaje en ese decodificador usando solo audio análisis para descubrimiento:
Objective-C
id<GNSPublication> publication = [messageManager publicationWithMessage:message
paramsBlock:^(GNSPublicationParams *params) {
params.strategy = [GNSStrategy strategyWithParamsBlock:^(GNSStrategyParams *params) {
params.discoveryMediums = kGNSDiscoveryMediumsAudio;
params.discoveryMode = kGNSDiscoveryModeScan;
}];
}];
Swift
let publication = messageManager.publication(with: message,
paramsBlock: { (params: GNSPublicationParams?) in
guard let params = params else { return }
params.strategy = GNSStrategy(paramsBlock: { (params: GNSStrategyParams?) in
guard let params = params else { return }
params.discoveryMediums = .audio
params.discoveryMode = .scan
})
})
Cómo habilitar el registro de depuración
El registro de depuración imprime eventos internos significativos en la consola que se pueden útil para rastrear problemas que pueden surgir durante la integración de Nearby Mensajes a tu app. Solicitaremos estos registros si te comunicas con nosotros por asistencia técnica.
Debes habilitarlo antes de crear un administrador de mensajes. Este fragmento de código muestra Cómo habilitar el registro de depuración:
Objective-C
[GNSMessageManager setDebugLoggingEnabled:YES];
Swift
GNSMessageManager.setDebugLoggingEnabled(true)
Cómo hacer un seguimiento del estado del permiso de Nearby
El consentimiento del usuario es obligatorio para habilitar la detección de dispositivos. Esto lo indica el
Estado de permiso de Nearby. En la primera llamada para crear una publicación o
suscripción, se le presenta al usuario un cuadro de diálogo de consentimiento. Si el usuario no
consentimiento, la detección de dispositivos no funcionará. En este caso, tu app debería mostrar una
para recordarle al usuario que la detección de dispositivos está inhabilitada. El permiso
se almacena en NSUserDefaults
.
En el siguiente fragmento, se muestra la suscripción al estado del permiso. El se llama al controlador de cambio de estado del permiso cada vez que cambia el estado, y se no se llama la primera vez hasta que el usuario otorga o rechaza el permiso. Libera el objeto de permiso para detener la suscripción.
Objective-C
GNSPermission *nearbyPermission = [[GNSPermission alloc] initWithChangedHandler:^(BOOL granted) {
// Update the UI here
}];
Swift
let nearbyPermission = GNSPermission(changedHandler: { (granted: Bool) in
// Update the UI here
})
Tu app puede proporcionar una forma para que el usuario cambie el estado del permiso. para por ejemplo, con un interruptor en una página de configuración.
Este es un ejemplo de cómo obtener y configurar el estado del permiso.
Objective-C
BOOL permissionState = [GNSPermission isGranted];
[GNSPermission setGranted:!permissionState]; // toggle the state
Swift
let permissionState = GNSPermission.isGranted()
GNSPermission.setGranted(!permissionState) // toggle the state
Seguimiento de la configuración del usuario que afecta a Nearby
Si el usuario rechazó el permiso del micrófono o de Bluetooth, o tenga el Bluetooth desactivado, Nearby no funcionará bien o podría no funcionar en absoluto. En estos casos, tu aplicación debería mostrar un mensaje que alerte al usuario que la interfaz de Nearby las operaciones se obstaculizan. En el siguiente fragmento, se muestra cómo hacer un seguimiento del estado de esta configuración del usuario pasando controladores cuando se crea el mensaje administrador:
Objective-C
GNSMessageManager *messageManager = [[GNSMessageManager alloc]
initWithAPIKey:API_KEY
paramsBlock:^(GNSMessageManagerParams *params) {
params.microphonePermissionErrorHandler = ^(BOOL hasError) {
// Update the UI for microphone permission
};
params.bluetoothPowerErrorHandler = ^(BOOL hasError) {
// Update the UI for Bluetooth power
};
params.bluetoothPermissionErrorHandler = ^(BOOL hasError) {
// Update the UI for Bluetooth permission
};
}];
Swift
let messageManager = GNSMessageManager(
APIKey: API_KEY,
paramsBlock: { (params: GNSMessageManagerParams?) in
guard let params = params else { return }
params.microphonePermissionErrorHandler = { (hasError: Bool) in
// Update the UI for microphone permission
}
params.bluetoothPowerErrorHandler = { (hasError: Bool) in
// Update the UI for Bluetooth power
}
params.bluetoothPermissionErrorHandler = { (hasError: Bool) in
// Update the UI for Bluetooth permission
}
})
Anula el diálogo del permiso de Nearby
Según los parámetros que pases a tus publicaciones y suscripciones iOS puede solicitar varios permisos antes de permitir que Nearby funcione. Para por primera vez, la estrategia predeterminada escucha los datos transmitidos audio, por lo que iOS solicitará permiso para usar el micrófono. En estos casos, Nearby mostrará una "solicitud preliminar" Diálogo que explica por qué se le está pidiendo al usuario que den permiso.
Si quieres proporcionar una "solicitud preliminar" personalizada de diálogo, configura
el parámetro permissionRequestHandler
a un bloque personalizado en la publicación
parámetros de suscripción. Tu bloque personalizado debe llamar a permissionHandler
.
bloquear después de que el usuario haya respondido. En el siguiente fragmento, se muestra cómo hacerlo
para una publicación:
Objective-C
id<GNSPublication> publication =
[messageManager publicationWithMessage:[GNSMessage messageWithContent:[name dataUsingEncoding:NSUTF8StringEncoding]]
paramsBlock:^(GNSPublicationParams *params) {
params.permissionRequestHandler = ^(GNSPermissionHandler permissionHandler) {
// Show your custom dialog here.
// Don't forget to call permissionHandler() with YES or NO when the user dismisses it.
};
}];
Swift
let publication =
messageManager.publication(with: GNSMessage(content: name.data(using: .utf8)),
paramsBlock: { (params: GNSPublicationParams?) in
guard let params = params else { return }
params.permissionRequestHandler = { (permissionHandler: GNSPermissionHandler?) in
// Show your custom dialog here.
// Don't forget to call permissionHandler() with true or false when the user dismisses it.
}
})
Operación en segundo plano
Las publicaciones y suscripciones que usan BLE para la detección de dispositivos pueden funcionar en en segundo plano. Estas son algunas cuestiones que debes tener en cuenta si decides utilizarlas modo en segundo plano:
- Las operaciones en segundo plano deben usar solo el medio BLE; El audio no es compatible.
- Existe un costo adicional de batería para la BLE en segundo plano. El costo es bajo, pero debes medirlo antes de decidirte a usar el modo en segundo plano.
- iOS le pedirá permiso al usuario para anunciar a través de BLE en segundo plano.
Para agregar este modo a una publicación o suscripción, sigue estos pasos adicionales pasos:
Habilita el modo en segundo plano y solo BLE en tu publicación o suscripción mediante y pasar un objeto
GNSStrategy
configurado correctamente. El siguiente fragmento muestra cómo hacerlo para una suscripción:Objective-C
id<GNSSubscription> subscription = [messageManager subscriptionWithMessageFoundHandler:^(GNSMessage *message) { // Add the name to a list for display } messageLostHandler:^(GNSMessage *message) { // Remove the name from the list } paramsBlock:^(GNSSubscriptionParams *params) { params.strategy = [GNSStrategy strategyWithParamsBlock:^(GNSStrategyParams *params) { params.allowInBackground = YES; params.discoveryMediums = kGNSDiscoveryMediumsBLE; }]; }];
Swift
let subscription = messageManager.subscription(messageFoundHandler: { (message: GNSMessage?) in // Add the name to a list for display }, messageLostHandler: { (message: GNSMessage?) in // Remove the name from the list }, paramsBlock:{ (params: GNSSubscriptionParams?) in guard let params = params else { return } params.strategy = GNSStrategy(paramsBlock: { (params: GNSStrategyParams?) in guard let params = params else { return } params.allowInBackground = true params.discoveryMediums = .BLE }) })
Agrega estas entradas al
Info.plist
de tu app:UIBackgroundModes
entradas:bluetooth-central
para el escaneo BLE en segundo plano Solo necesarias cuando el modo descubrimiento incluye el análisis. lo hace de forma predeterminada.bluetooth-peripheral
para publicidad BLE en segundo plano Requisitos solo cuando el modo de descubrimiento incluye transmisión. lo hace de forma predeterminada.
String de
NSBluetoothPeripheralUsageDescription
que describe el motivo publicarás anuncios en BLE. Por ejemplo, “Un token anónimo se que se anuncia a través de Bluetooth para descubrir dispositivos cercanos". Consulta Documentación de Apple para conocer los detalles.
El sistema puede cerrar tu app en cualquier momento mientras se encuentre en segundo plano. Si el modo en segundo plano es un parámetro de configuración que el usuario puede habilitar o inhabilitar, La app debería hacer lo siguiente:
- Guarda el valor del modo en segundo plano en
NSUserDefaults
cada vez que el usuario lo cambia. - Al inicio, léelo desde
NSUserDefaults
y restablece Nearby. publicaciones o suscripciones si está habilitado el modo en segundo plano.
- Guarda el valor del modo en segundo plano en
Notificaciones en segundo plano
Si quieres que tu app notifique al usuario cuando una suscripción reciba un mensaje, haz lo siguiente: mientras se ejecuta en segundo plano, puedes usar notificaciones locales.
Sigue estos pasos para agregarlos a tu app:
Regístrate para recibir notificaciones locales al inicio:
Objective-C
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) { [[UIApplication sharedApplication] registerUserNotificationSettings: [UIUserNotificationSettings settingsForTypes: UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]]; }
Swift
UIApplication.shared.registerUserNotificationSettings( UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil))
Envía una notificación local en el controlador de mensaje encontrado de tu suscripción:
Objective-C
GNSMessageHandler myMessageFoundHandler = ^(GNSMessage *message) { // Send a local notification if not in the foreground. if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) { UILocalNotification *localNotification = [[UILocalNotification alloc] init]; localNotification.alertBody = @"Message received"; [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification]; } // Process the new message... };
Swift
let myMessageFoundHandler: GNSMessageHandler = { (message: GNSMessage?) in // Send a local notification if not in the foreground. if UIApplication.shared.applicationState != .active { let localNotification = UILocalNotification() localNotification.alertBody = "Message received" UIApplication.shared.presentLocalNotificationNow(localNotification) } // Process the new message... }