Obtener mensajes de las balizas

Tu app puede suscribirse a los mensajes de balizas de Bluetooth de bajo consumo (BLE) con el mismo mecanismo que se usa para suscribirse a los mensajes publicados por otros dispositivos cercanos.

De forma predeterminada, las suscripciones a balizas solo funcionan cuando la app está en primer plano. Cuando tu app pasa a segundo plano, las suscripciones dejan de buscar balizas automáticamente. Consulta Búsqueda en segundo plano para obtener detalles sobre cómo habilitar la búsqueda en segundo plano.

Para suscribirte a balizas, configura el parámetro deviceTypesToDiscover como kGNSDeviceBLEBeacon en los parámetros de suscripción. En el siguiente fragmento, se muestra cómo hacerlo:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
    })

La suscripción anterior solo descubre las balizas que son propiedad de tu proyecto y recibe todos los mensajes de esas balizas. Si quieres recibir mensajes de balizas registradas con un espacio de nombres diferente, puedes pasar un espacio de nombres en los parámetros de suscripción. Del mismo modo, si deseas un tipo de mensaje específico, también puedes pasar un tipo de mensaje para filtrar. En el siguiente fragmento, se muestra cómo hacerlo:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.messageNamespace = @"com.mycompany.mybeaconservice";
                              params.type = @"mybeacontype";
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.messageNamespace = "com.mycompany.mybeaconservice"
      params.type = "mybeacontype"
    })

De forma predeterminada, una suscripción de baliza analiza ambos tipos de balizas, Eddystone y iBeacon. Cuando se habilita el análisis de iBeacon, se les pedirá a los usuarios que otorguen permiso para que la app use sus datos de ubicación. El Info.plist de tu app debe incluir la clave NSLocationWhenInUseUsageDescription con una breve explicación de por qué se usa la ubicación. Para obtener más información, consulta la documentación de Apple.

Si solo quieres buscar balizas de Eddystone, puedes inhabilitar la búsqueda de iBeacon en GNSBeaconStrategy, y iOS no le pedirá permiso al usuario para usar la ubicación. En el siguiente fragmento, se muestra cómo inhabilitar la búsqueda de iBeacon para la suscripción original anterior:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.beaconStrategy =
                                  [GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                    params.includeIBeacons = NO;
                                  };
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.beaconStrategy =
          GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
            params.includeIBeacons = false
          })
    })

De forma predeterminada, la exploración de bajo consumo está habilitada, lo que a veces puede generar latencias grandes cuando se buscan balizas de Eddystone. Cuando se inhabilita el modo de bajo consumo, se usa el análisis de iBeacon para ayudar a encontrar balizas de Eddystone, lo que puede reducir estas latencias. Sin embargo, esto genera un mayor uso de la batería, y iOS le pedirá al usuario permiso para usar la ubicación.

En el siguiente fragmento, se muestra cómo inhabilitar el modo de bajo consumo cuando se buscan balizas de Eddystone.

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.beaconStrategy =
                                  [GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                    params.includeIBeacons = NO;
                                    params.lowPowerPreferred = NO;
                                  };
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.beaconStrategy =
          GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
            params.includeIBeacons = false
            params.lowPowerPreferred = false
          })
    })

Cuando se buscan iBeacons, el diálogo de permiso de ubicación de iOS está precedido por el diálogo de permiso de Dispositivos cercanos. Si deseas anular este diálogo (por ejemplo, para proporcionar un diálogo de "verificación previa" que explique por qué se necesita el permiso de ubicación), establece permissionRequestHandler en un bloque personalizado en los parámetros de suscripción. En el siguiente fragmento, se muestra cómo hacerlo:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.permissionRequestHandler = ^(GNSPermissionHandler permissionHandler) {
                                // Show your custom dialog here, and don't forget to call permissionHandler after it is dismissed
                                permissionHandler(userGavePermission);
                              };
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.permissionRequestHandler = { (permissionHandler: GNSPermissionHandler!) in
        // Show your custom dialog here, and don't forget to call permissionHandler after it is dismissed
        permissionHandler(userGavePermission);
      }
    })

Análisis en segundo plano

Dado que la búsqueda de balizas usa BLE, puede funcionar en segundo plano. A continuación, se incluyen algunos aspectos que debes tener en cuenta cuando decidas usar el modo en segundo plano:

  • Hay un costo adicional de batería para el BLE en segundo plano. El costo es bajo, pero debes medirlo antes de decidir usar el modo en segundo plano.
  • iOS le pedirá permiso al usuario para usar la ubicación en segundo plano si la búsqueda de iBeacon está habilitada o si el modo de bajo consumo está inhabilitado.

Para habilitar la búsqueda de balizas en segundo plano, sigue estos pasos adicionales:

  • Habilita el modo en segundo plano para tu suscripción pasando un objeto GNSBeaconStrategy configurado correctamente. En el siguiente fragmento, se muestra cómo hacerlo:

    Objective-C

    id<GNSSubscription> beaconSubscription = [messageManager
        subscriptionWithMessageFoundHandler:myMessageFoundHandler
                         messageLostHandler:myMessageLostHandler
                                paramsBlock:^(GNSSubscriptionParams *params) {
                                  params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                                  params.beaconStrategy = [GNSBeaconStrategy
                                      strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                        params.allowInBackground = YES;
                                      }];
                                }];
    

    Swift

    let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
        myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
        paramsBlock: { (params: GNSSubscriptionParams!) in
          params.deviceTypesToDiscover = .BLEBeacon
          params.beaconStrategy =
              GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
                params.allowInBackground = true
              })
        })
    

  • Agrega las entradas requeridas al Info.plist de tu app:

    • Entradas UIBackgroundModes:

      • bluetooth-central para la búsqueda de BLE en segundo plano.
      • location para la detección de iBeacon en segundo plano con el modo de alta potencia. Puedes omitir este paso si solo realizas análisis de bajo consumo para balizas de Eddystone.
    • Cadena NSLocationAlwaysUsageDescription que describe por qué se hará un seguimiento de la ubicación del usuario en segundo plano. Por ejemplo, "Se necesita tu ubicación para buscar balizas en segundo plano". Para obtener más información, consulta la documentación de Apple. Puedes omitir este parámetro si solo realizas análisis de bajo consumo para balizas de Eddystone.

  • ¿El usuario puede habilitar o inhabilitar la búsqueda en segundo plano en tu app? Si es así, debes guardar el valor del modo en segundo plano en NSUserDefaults, ya que iOS puede cerrar tu app en cualquier momento mientras se ejecuta en segundo plano. Tu app debería hacer lo siguiente:

    • Guarda el valor del modo en segundo plano en NSUserDefaults cada vez que el usuario lo cambie.
    • Al inicio, léelo desde NSUserDefaults y restablece la suscripción de baliza si el modo en segundo plano está habilitado.

Notificaciones en segundo plano

Si quieres que tu app notifique al usuario cuando se detecten balizas mientras está en segundo plano, puedes usar notificaciones locales. Para obtener más información, consulta las notificaciones en segundo plano.