Tu app puede suscribirse a mensajes de balizas de 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 balizas solo funcionan cuando tu 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 las 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 deseas 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 específico de mensaje, 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 a balizas busca ambos tipos de balizas: Eddystone y iBeacon. Cuando se habilita la búsqueda de iBeacon, se les pedirá a los usuarios que otorguen permiso para que la app use sus datos de ubicación. El archivo 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 información.
Si solo deseas 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 búsqueda de bajo consumo está habilitada, lo que a veces puede generar latencias grandes cuando se encuentran balizas de Eddystone. Cuando se inhabilita el modo de bajo consumo, se usa la búsqueda de iBeacon para ayudar a encontrar balizas de Eddystone, lo que puede reducir estas latencias. Sin embargo, esto genera un mayor uso de batería, y iOS le pedirá 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 está precedido por el diálogo de permiso de Nearby. Si deseas anular este diálogo (por ejemplo, para proporcionar un diálogo de "preparación" que explique por qué se necesita el permiso de ubicación), configura 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);
}
})
Búsqueda en segundo plano
Como la búsqueda de balizas usa BLE, puede funcionar en segundo plano. Estos son algunos aspectos que debes tener en cuenta cuando decidas usar el modo en segundo plano:
- Hay un costo de batería adicional para 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 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 para tu suscripción, pasa un objeto
GNSBeaconStrategyconfigurado 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 necesarias al archivo
Info.plistde tu app:Entradas
UIBackgroundModes:bluetooth-centralpara la búsqueda de BLE en segundo planolocationpara la búsqueda de iBeacon en segundo plano con el modo de alta potencia Puedes omitir esto si solo realizas búsquedas de bajo consumo para balizas de Eddystone.
String
NSLocationAlwaysUsageDescriptionque 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 información. Puedes omitir esto si solo realizas búsquedas de bajo consumo para balizas de Eddystone.
¿Puede el usuario 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 está en segundo plano. Tu app debe hacer lo siguiente:- Guardar el valor del modo en segundo plano en
NSUserDefaultscada vez que el usuario lo cambie - Al inicio, léelo desde
NSUserDefaultsy restablece la suscripción a la baliza si el modo en segundo plano está habilitado.
- Guardar el valor del modo en segundo plano en
Notificaciones en segundo plano
Si deseas que tu app notifique al usuario cuando se descubran balizas en segundo plano, puedes usar notificaciones locales. Para obtener más información, consulta las notificaciones en segundo plano.