Tu app puede suscribirse a mensajes de baliza Bluetooth de bajo consumo (BLE) con el mismo mecanismo que se usa para suscribirse a mensajes publicados por otros dispositivos cercanos.
De forma predeterminada, las suscripciones a baliza solo funcionan cuando la aplicación está en primer plano. Cuando tu app pasa a segundo plano, las suscripciones automáticamente dejan de buscar balizas. Consulta Análisis en segundo plano para obtener detalles sobre cómo habilitar el análisis en segundo plano.
Para suscribirte a píxeles contadores, establece el parámetro deviceTypesToDiscover
en 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 detecta balizas que son propiedad de tu proyecto y recibe todos los mensajes de esas balizas. Si deseas recibir mensajes de píxeles contadores registrados 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 específico de mensaje, también puedes pasar un tipo de mensaje para filtrarlo. 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 a la baliza busca ambos tipos, iBeacon y Eddystone. Cuando el análisis de iBeacon está habilitado, se les solicitará 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. Consulta la
documentación de Apple
para obtener más detalles.
Si solo deseas buscar balizas de Eddystone, puedes inhabilitar el análisis 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 el análisis 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 búsqueda de baja energía está habilitada, lo que a veces puede generar grandes latencias cuando se encuentran balizas de Eddystone. Cuando el modo de bajo consumo está inhabilitado, se usa el análisis de iBeacon para encontrar balizas de Eddystone, lo que puede reducir estas latencias. Sin embargo, esto hace que aumente el uso de la batería y que iOS le solicite permiso al usuario 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 es precedido por el diálogo de permisos de Nearby. 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
Como la búsqueda de balizas utiliza 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:
- Se aplica un costo de batería adicional para la reproducción en segundo plano de BLE. El costo es bajo, pero debes medirlo antes de decidir usar el modo en segundo plano.
- iOS le solicitará permiso al usuario para usar la ubicación en segundo plano si el análisis de iBeacon está habilitado o si el modo de bajo consumo está inhabilitado.
Para habilitar la búsqueda de balizas en segundo plano, sigue estos pasos adicionales:
Para habilitar el modo en segundo plano de tu suscripción, pasa 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 obligatorias al
Info.plist
de tu app:Entradas de
UIBackgroundModes
:bluetooth-central
para el escaneo BLE en segundo planolocation
para el escaneo de iBeacon en segundo plano con el modo de alta energía Puedes omitir esto si realizas una búsqueda de baja energía solo para balizas Eddystone.
Es una cadena
NSLocationAlwaysUsageDescription
que describe por qué harás un seguimiento de la ubicación del usuario en segundo plano. Por ejemplo, “Se necesita tu ubicación para buscar balizas en segundo plano”. Consulta la documentación de Apple para obtener más detalles. Puedes omitir esto si realizas una búsqueda de baja potencia solo para balizas Eddystone.
¿El usuario puede habilitar o inhabilitar el análisis 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 la app en cualquier momento mientras se encuentre en segundo plano. Tu app debe 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 a la baliza si el modo en segundo plano está habilitado.
- Guarda el valor del modo en segundo plano en
Notificaciones en segundo plano
Si deseas que tu app notifique al usuario cuando se detecten balizas en segundo plano, puedes usar las notificaciones locales. Para obtener más detalles, consulta las notificaciones en segundo plano.