Obtener mensajes de las balizas

Tu app puede suscribirse a los mensajes de baliza 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 modo de baliza funcionan solo cuando la aplicación está en primer plano. Cuando la app pasa a segundo plano, se detienen automáticamente las suscripciones el escaneo de balizas. Consulta Análisis en segundo plano para obtener Detalles para habilitar el análisis en segundo plano.

Para suscribirse a píxeles contadores, establezca el parámetro deviceTypesToDiscover en kGNSDeviceBLEBeacon en los parámetros de suscripción. El siguiente fragmento demuestra cómo hacer esto:

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 balizas que son propiedad de tu proyecto y recibe todos los mensajes de esas balizas. Si quieres recibir mensajes de contadores registrados con un espacio de nombres diferente, puede pasar un espacio de nombres en el parámetros de suscripción. Del mismo modo, si quieres un tipo específico de mensaje, puedes también puede pasar un tipo de mensaje para filtrar. En el siguiente fragmento, se muestra cómo haz lo siguiente:

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 a la baliza escanea ambos tipos de balizas: Eddystone y iBeacon Cuando el análisis de iBeacon esté habilitado, se les pedirá a los usuarios que otorguen permiso para que la app use sus datos de ubicación. La Info.plist de tu app debe Incluye la clave NSLocationWhenInUseUsageDescription con una breve explicación de por qué se usa la ubicación. Consulta Documentación de Apple para conocer los detalles.

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

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, el escaneo de bajo consumo está habilitado, lo que a veces puede generar grandes latencias al encontrar balizas de Eddystone. Cuando se inhabilita el modo de bajo consumo, El escaneo de iBeacon se usa para encontrar balizas de Eddystone, lo que puede reducir estas latencias. Sin embargo, esto generará un mayor uso de batería, y iOS le solicitará al usuario por el permiso de uso de la ubicación.

En el siguiente fragmento, se muestra cómo inhabilitar el modo de bajo consumo cuando se buscan Píxeles contadores 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, aparece el diálogo de permiso de ubicación de iOS antes del el diálogo de permisos de Nearby. Si quieres anular este diálogo (para para proporcionar una “solicitud preliminar” de diálogo que explica por qué el permiso de ubicación se requiere), establece permissionRequestHandler en un bloque personalizado en la 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

Debido a que la búsqueda de balizas utiliza BLE, esta función puede funcionar en segundo plano. Estos son algunos ejemplos aspectos que debes tener en cuenta cuando decides usar el modo en segundo plano:

  • 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á al usuario permiso para usar la ubicación en segundo plano si La búsqueda con iBeacon está habilitada o se inhabilitó el modo de bajo consumo.

Para habilitar el escaneo de balizas en segundo plano, siga estos pasos adicionales:

  • Habilita el modo en segundo plano para tu suscripción pasando una solicitud configurado GNSBeaconStrategy objeto. En el siguiente fragmento, se muestra cómo hacer esto:

    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 obligatorias a la Info.plist de tu app:

    • UIBackgroundModes entradas:

      • bluetooth-central para el escaneo BLE en segundo plano
      • location para el escaneo de iBeacon en segundo plano con el modo de alta potencia. Puedes omitir este paso si realizas un escaneo de bajo consumo para Eddystone solo balizas.
    • NSLocationAlwaysUsageDescription cadena que describe por qué se hará un seguimiento la ubicación del usuario en segundo plano. Por ejemplo, "Tu ubicación es necesario para escanear balizas en segundo plano". Consulta Documentación de Apple para conocer los detalles. Puedes omitir este paso si realizas un escaneo de bajo consumo para Solo para balizas de Eddystone.

  • ¿Puede el usuario habilitar o inhabilitar el análisis en segundo plano en tu app? Si es así, debería guardar el valor del modo en segundo plano en NSUserDefaults porque iOS puede cerrar la app en cualquier momento mientras está en segundo plano. Tu app debería hacer lo lo siguiente:

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

Notificaciones en segundo plano

Si deseas 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 notificaciones en segundo plano.