Aplikacja może subskrybować wiadomości beacon Bluetooth Low Energy (BLE) za pomocą tego samego mechanizmu, który służy do subskrybowania wiadomości publikowanych przez z innymi urządzeniami w pobliżu.
Domyślnie subskrypcje typu beacon działają tylko wtedy, gdy aplikacja działa na pierwszym planie. Gdy aplikacja działa w tle, subskrypcje są automatycznie zatrzymywane w poszukiwaniu beaconów. Zobacz Skanowanie w tle, aby dowiedzieć się, jak – znajdziesz szczegółowe informacje o tym, jak włączyć skanowanie w tle.
Aby subskrybować beacony, ustaw parametr deviceTypesToDiscover
na
kGNSDeviceBLEBeacon
w parametrach subskrypcji. Ten fragment kodu
pokazuje, jak to zrobić:
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
})
Powyższa subskrypcja wykrywa tylko beacony należące do Twojego projektu i otrzymuje wszystkie wiadomości z tych beaconów. Jeśli chcesz otrzymywać wiadomości od beaconów zarejestrowanych w innej przestrzeni nazw, możesz przekazać przestrzeń nazw w parametrów subskrypcji. Analogicznie, jeśli chcesz przesłać wiadomość konkretnego typu, mogą też przekazywać typ wiadomości do filtrowania. Ten fragment kodu pokazuje, jak wykonaj następujące czynności:
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"
})
Domyślnie subskrypcja beaconów skanuje obydwa typy beaconów, Eddystone i
iBeacon Gdy skanowanie iBeacon jest włączone, użytkownicy są proszeni o podanie
dostępu aplikacji do danych o lokalizacji. Info.plist
w Twojej aplikacji musi
dołącz klucz NSLocationWhenInUseUsageDescription
z krótkim wyjaśnieniem
dlaczego lokalizacja jest używana. Zobacz
Dokumentacja Apple
.
Jeśli chcesz skanować tylko w poszukiwaniu beaconów Eddystone, wyłącz iBeacon
w GNSBeaconStrategy
, a iOS nie będzie prosić użytkownika o
dostępu do lokalizacji. Fragment kodu poniżej pokazuje, jak wyłączyć funkcję iBeacon
skanowanie w poszukiwaniu oryginalnej subskrypcji powyżej:
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
})
})
Domyślnie włączone jest skanowanie o niskim zużyciu energii, co może czasem prowadzić do dużych czas oczekiwania przy szukaniu beaconów Eddystone. Gdy tryb oszczędzania baterii jest wyłączony, Skanowanie iBeacon pozwala znaleźć sygnały Eddystone, które mogą ograniczyć i opóźnieniach. Jednak powoduje to jednak większe wykorzystanie baterii, a iOS wysyła pytanie, o pozwolenie na korzystanie z lokalizacji.
Ten fragment kodu pokazuje, jak wyłączyć tryb oszczędzania baterii podczas skanowania Eddystone beacon.
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
})
})
Podczas skanowania w poszukiwaniu iBeacons okno uprawnień dostępu do lokalizacji w iOS jest poprzedzone znakiem
okna z uprawnieniami dostępu do urządzeń w pobliżu. Jeśli chcesz zastąpić to okno (dla
na przykład, aby udostępnić „proces wstępny” okno z wyjaśnieniem, dlaczego dostęp do lokalizacji
jest wymagany), ustaw permissionRequestHandler
na niestandardowy blok w
parametrów subskrypcji. Jak to zrobić:
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);
}
})
Skanowanie w tle
Skanowanie beaconów korzysta z BLE, więc może działać w tle. Oto kilka o czym musisz pamiętać, wybierając tryb działania w tle:
- Jest dodatkowy koszt baterii w przypadku obsługi BLE w tle. Koszt jest niewielki, ale należy go zmierzyć przed użyciem trybu działania w tle.
- iOS poprosi użytkownika o pozwolenie na używanie lokalizacji w tle, jeśli Skanowanie iBeacon jest włączone lub tryb oszczędzania baterii jest wyłączony.
Aby włączyć skanowanie przy użyciu beaconu w tle, wykonaj te dodatkowe czynności:
Włącz tryb działania w tle dla swojej subskrypcji, przekazując poprawnie skonfigurowany obiekt
GNSBeaconStrategy
. Ten fragment pokazuje, jak to zrobić to: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 }) })
Dodaj wymagane wpisy do
Info.plist
aplikacji:UIBackgroundModes
wpisów:bluetooth-central
do skanowania BLE w tle.location
w przypadku skanowania iBeacon w tle w trybie wysokiego zużycia energii. Możesz to pominąć, jeśli wykonujesz skanowanie przy niskim poziomie energii Eddystone tylko za pomocą beaconów.
NSLocationAlwaysUsageDescription
ciąg tekstowy opisujący, dlaczego śledzisz z informacjami o lokalizacji użytkownika w tle. Na przykład „Twoja lokalizacja to konieczne jest skanowanie w poszukiwaniu beaconów w tle”. Zobacz Dokumentacja Apple . Możesz to pominąć, jeśli przeprowadzasz skanowanie o niskim zużyciu energii Tylko eddystone beacon.
Czy użytkownik może włączyć lub wyłączyć skanowanie w tle w Twojej aplikacji? Jeśli tak, należy zapisać wartość trybu działania w tle na
NSUserDefaults
, bo iOS może możesz jej używać w każdej chwili, gdy działa ona w tle. Aplikacja powinna wykonywać :- Zapisuj wartość trybu działania w tle na
NSUserDefaults
za każdym razem, gdy użytkownik ją zmienić. - Po uruchomieniu odczytaj dane z urządzenia
NSUserDefaults
i przywróć beacon subskrypcji, jeśli włączony jest tryb działania w tle.
- Zapisuj wartość trybu działania w tle na
Powiadomienia w tle
Jeśli chcesz, by aplikacja powiadamiała użytkownika o wykryciu beaconów w trakcie tła, można użyć powiadomień lokalnych. Więcej informacji: powiadomień w tle.