2015-01-31 4 views
16

Istnieje wiele nieporozumień dotyczących ograniczeń, które są stosowane przez iOS w aplikacjach, które chcą skanować sygnały BLE \ urządzenia peryferyjne. Po przeczytaniu kilku blogów i odpowiedzi związanych z przepełnieniem stosu, chcę sprawdzić, czy poprawnie rozumiem wszystkie problemy. Proszę mnie poprawić, jeśli coś jest źle zrozumiane lub pominięte. Odnoszę się tylko do systemu iOS 7 lub nowszego i koncentruję się na wykrywaniu, a nie łączeniu (czy można połączyć się z CLBeacon przy użyciu interfejsu API do monitorowania iBeacon &?).Wykrywanie radiolatarni za pomocą iBeacon Monitoring i Ranging vs CoreBluetooth scanForPeripheralsWithServices

Opcje beaconów są jasne - użyj peryferiów BLE ogólnego przeznaczenia lub użyj peryferyjnego BLE, który reklamuje się w iBeacon format (Poza tym niestandardowe urządzenie peryferyjne może reklamować się w formacie iBeacon w pakiecie pomocniczym i innym format w pakiecie skanowania-odpowiedzi).

Ograniczenia ogólne

  • iBeacon Począwszy pozwoli Ci wiedzieć, jakie sygnały nawigacyjne są wokół ciebie. Musisz podać ProximityUUID, który uprzednio anonsuje beacon (brak "ogólnego" skanowania). didRangeBeacons będzie wywoływana co sekundę z tablicą obiektów CLBeacon, które zostały ostatnio znalezione. Odległość od radiolatarni i jej dokładność są obliczane przez system iOS za pomocą jakiegoś poufnego algorytmu, który naprawdę znają tylko programiści Apple'a (algorytm jest oparty na wartościach rssi i bajcie kalibracji rssi-at-1-metrowej, którą reklamuje się sygnał nawigacyjny). Możesz także użyć Monitorowania iBeacon do wywoływania delegata za każdym razem, gdy wchodzisz lub wychodzisz z regionu - ponownie musisz podać ProximityUUID, którego szukasz (możesz również podać poważnego, małego). "Wyjście z regionu" definiuje się jako czas, w którym nie otrzymuje się żadnej reklamy, a zatem nie może być natychmiastowe. Liczba regionów, które mogą być monitorowane w tym samym czasie: na urządzeniu jest ograniczona do 20 - Oznacza to, że jeśli inne aplikacje monitorują \ o tej samej godzinie, Twoja aplikacja może nie być w stanie monitorować \ zasięgu (w prawo?).
  • CoreBluetooth - Możesz także wykryć inne struktury reklamowe w reklamie beacon. Jeśli beacon reklamuje się również w formacie iBeacon, nie można zobaczyć pól iBeacon (ProximityUUID, major, minor ...), mimo że są one wysyłane w standardowej strukturze reklamowej określonej przez producenta, którą można zobaczyć w innych przypadkach .

bieganie w Planie - Im mniej ograniczone stosowanie literami:

  • iBeacon zakrojone i monitoring - bez dalszych ograniczeń.
  • CoreBluetooth - przekazywanie nil w serviceUUIDs z scanForPeripheralsWithServices wyszuka wszystkie urządzenia peryferyjne. Przekazywanie CBCentralManagerScanOptionAllowDuplicatesKey jako YES w opcjach spowoduje, że didDiscoverPeripheral będzie wywoływane wiele razy dla tego samego peryferyjnego \ beacona (zakładam, że używając licznika, który wykryłeś, reklama nie została odebrana od jakiegoś czasu i założono, że użytkownik opuścił "region") .

działa w tle - Im bardziej ograniczony use-case:

  • iBeacon Począwszy nie działa bezpośrednio. Monitorowanie iBeacon zadzwoni pod numer didEnterRegion i sprawi, że czas działania aplikacji wyniesie 6 sekund - w którym można rozpocząć wprowadzanie wartości (na przykład, aby wykryć poważny błąd o mniejszej wartości).Wykrywanie może nie być natychmiastowe, ponieważ iOS włącza i wyłącza skanowanie w celu zachowania mocy baterii. Jeśli wpiszesz region wielu sygnałów nawigacyjnych z tym samym ProximityUUID, a monitorujesz ten UUID bez określonego głównego i \ lub mniejszy, didEnterRegion zostanie wywołany, gdy zaczniesz odbierać sygnał z pierwszego sygnału nawigacyjnego - jednak, jeśli nie zakończyłeś region pierwszego sygnału nawigacyjnego, a Ty również wszedłeś w rejon drugiego sygnału nawigacyjnego, aplikacja nie zostanie ponownie uruchomiona (didEnterRegion nie będzie ponownie wywoływana), więc nie możesz zacząć od wykrycia drugiego dużego sygnału nawigacyjnego o numerze &. Aplikacja nie może po prostu wyskoczyć na pierwszy plan, ale może tworzyć lokalne powiadomienia i inne operacje w tle.
  • CoreBluetooth - zgodnie z Core Bluetooth Background ProcessingscanForPeripheralsWithServices może działać w tle przy użyciu, ale należy podać co najmniej jedną IDUsługi. didDiscoverPeripheral otrzyma czas działania wynoszący 10 sekund. Używanie CBCentralManagerScanOptionAllowDuplicatesKey nie zadziała - didDiscoverPeripheral zostanie wywołane raz dla każdego urządzenia peryferyjnego. Dlatego nie można wykryć "wyjścia" z regionu i "ponownego wejścia". Przypuszczam, że możesz użyć niestandardowego urządzenia peryferyjnego BLE, które zmienia jego adres MAC w celu przezwyciężenia tego problemu. Aplikacja nie może po prostu wyskoczyć na pierwszy plan, ale może tworzyć lokalne powiadomienia i inne operacje w tle. Wykrywanie może nie być natychmiastowe, ponieważ iOS włącza i wyłącza skanowanie w celu zachowania mocy baterii.

bieganie po aplikacji ginie

  • Monitoring iBeacon - działa! Nawet jeśli użytkownik zabił aplikację lub urządzenie zostało ponownie uruchomione.
  • CoreBluetooth - aplikacja zostanie obudzona, jeśli została zabita przez iOS (z powodu braku aktywności lub ograniczeń pamięci). Jeśli jednak użytkownik jawnie zabił aplikację, nie zostanie ona przebudzona (co sprawia, że ​​pierwszy przypadek jest trudny do sprawdzenia). Nie wiem, co stanie się po ponownym uruchomieniu urządzenia ...

Czy ktoś ma więcej doświadczenia z tymi ograniczeniami? Czy może być używana jako lepsza alternatywa dla monitoringu iBeacon w niektórych przypadkach użycia?

Dzięki!

+0

dzięki bardzo pomocnemu opisowi. –

Odpowiedz

2

Masz w większości rację w swoim opisie. Zaledwie dwa wyjaśnienia:

  • Limit 20 region jest nie na urządzenie, aplikacja jest specyficzny. Niezależnie od tego, co robią inne aplikacje na urządzeniu mobilnym, Twoja aplikacja może monitorować do 20 regionów w systemie iOS. To powiedziawszy, możliwe są ograniczenia sprzętowe, które zależą od urządzenia, na ile regionów można monitorować w tle za pomocą pomocy sprzętowej. Limity te są nieudokumentowane. Jeśli przekroczysz te nieudokumentowane limity, prawdopodobnie wykrycie sygnałów nawigacyjnych w tle zajmie znacznie więcej czasu. (Pomimo tego, że tak czy owak, nie ma gwarancji systemu operacyjnego, gdy dojdzie do wykrycia.)

  • Nie można połączyć się z CLBeacon za pomocą funkcji API monitorowania i wywoływania. Te interfejsy API działają tylko z pakietami reklamowymi BLE, które są bezpołączeniowe.

Tak, alternatywnie można użyć scanForPeripheralsWithServices. Tak właśnie działają sygnalizatory Gimbal w celu implementacji własnego systemu. Istnieją jednak rzeczywiste wady pod względem czasu wykrywania tła i niezawodności.

+0

Dzięki, popatrzę na sygnalizatory Gimbal.Czy wiesz, że oprócz tego, że użytkownik jawnie zabija aplikację lub restartuje urządzenie, są inne wady? Próbuję zbudować sygnalizator, który będzie wykrywalny, nawet jeśli użytkownik pozostawił aplikację w tle przez długi czas. – Oren

+0

... i reklamuj więcej informacji niż 4 bajty główne + mniejsze. – Oren

+0

@davidyoung Czy możesz nieco bardziej szczegółowo opisać wady korzystania z usług ScanForPer urządzeń z usług? Czym oni są? (oprócz niemożności uruchomienia aplikacji w tle) – fspirit

Powiązane problemy