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 planolocation
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.
- 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 mientras esté en segundo plano, puedes usar notificaciones locales. Para obtener más información, consulta notificaciones en segundo plano.