Publicar y suscribirse

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.

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...
    }