如何在IOS中使用IBeacon
iBeacon 是蘋果公司2013年9月發(fā)布的移動設(shè)備用OS(iOS7)上配備的新功能。其工作方式是,配備有低功耗藍(lán)牙(BLE)通信功能的設(shè)備使用BLE技術(shù)向周圍發(fā)送自己特有的 ID,接收到該 ID 的應(yīng)用軟件會根據(jù)該 ID 采取一些行動。
從個(gè)人的角度看: iBeacon向四面八方不停地廣播信號,就像是往平靜的水面上扔了一塊石子,泛起層層漣漪(俗稱水波),波峰相當(dāng)于 iBeacon 的RSSI(接受信號強(qiáng)度指示),越靠近中心點(diǎn)的地方波峰越高(RSSI 越大),這個(gè)波峰的大小(RSSI 的值)受到扔石子時(shí)用力大小(發(fā)射功率)和水質(zhì)(周圍環(huán)境因子)的影響,離中心點(diǎn)越遠(yuǎn)水波越趨向于平靜,超過了一定值,水波會消失于無形,也就是說 iBeacon 向外廣播的距離是有范圍的,超過了這個(gè)范圍,將接受不到 iBeacon 的信號。
從iOS開發(fā)者的角度看: iBeacon 在 CoreLocation 框架中抽象為CLBeacon類, 該類有6個(gè)屬性,分別是:
proximityUUID,是一個(gè) NSUUID,用來標(biāo)識公司。每個(gè)公司、組織使用的 iBeacon 應(yīng)該擁有同樣的 proximityUUID。 major,主要值,用來識別一組相關(guān)聯(lián)的 beacon,例如在連鎖超市的場景中,每個(gè)分店的 beacon 應(yīng)該擁有同樣的 major。 minor,次要值,則用來區(qū)分某個(gè)特定的 beacon。 proximity,遠(yuǎn)近范圍的,一個(gè)枚舉值。typedef NS_ENUM(NSInteger, CLProximity) {CLProximityUnknown,// 無效CLProximityImmediate,//在幾厘米內(nèi)CLProximityNear,//在幾米內(nèi)CLProximityFar//超過 10 米以外,不過在測試中超不過10米就是far}accuracy,與iBeacon的距離。 rssi,信號輕度為負(fù)值,越接近0信號越強(qiáng),等于0時(shí)無法獲取信號強(qiáng)度。
Tip:proximityUUID,major,minor 這三個(gè)屬性組成 iBeacon 的唯一標(biāo)識符。
只要進(jìn)入iBeacon的范圍,就能喚醒 App(大約10秒鐘),即使在程序被殺掉的情況下。必要時(shí),可以使用UIApplication類的- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler;方法,請求更多的后臺執(zhí)行時(shí)間。
iBeacon的用途:我們可以用iBeacon可以進(jìn)行室內(nèi)定位(車庫,商場),智能打卡,提醒(離開某物體的時(shí)候,比如離開家)。
iBeacon 與 BLE 的區(qū)別iOS 中 iBeacon 是基于地理位置的微定位技術(shù),雖然借助手機(jī)藍(lán)牙進(jìn)行接收Majro、Minor,但是他們在開發(fā)工程中沒有任何關(guān)系。
iBeacon使用蘋果提供CoreLocation庫,然而在 BLE 在開發(fā)過程中使用CoreBluetooth庫。從上面提供的庫來看就很清楚了,特別是在 iOS8.0 之后的時(shí)候如果想使用iBeacon,必須讓用戶點(diǎn)擊是否允許XXapp使用地理位置。如果在第一次使用 iOS App 掃描iBeacon的時(shí)候沒有提示這句話,是不可能接收到iBeacon的信號(除非iOS 8.0之下)。如果是 BLE 則的開發(fā)過程中之需要提示用戶打開藍(lán)牙,并不要求其他的地理位置任何信息。
iBeacon 在 iOS 中的運(yùn)用權(quán)限請求在info.plist中添加NSLocationAlwaysAndWhenInUseUsageDescription,NSLocationWhenInUseUsageDescription,NSLocationAlwaysUsageDescription,請求地理位置權(quán)限。
開啟Background Modes
相關(guān)代碼import <CoreLocation/CoreLocation.h>。
初始化locationManager和beaconRegion。
- (CLLocationManager *)locationManager { if (!_locationManager) {_locationManager = [[CLLocationManager alloc] init];_locationManager.delegate = self; } return _locationManager;}- (CLBeaconRegion *)beaconRegion { if (!_beaconRegion) {_beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:Beacon_Device_UUID] identifier:@'test'];_beaconRegion.notifyEntryStateOnDisplay = YES; } return _beaconRegion;}
CLBeaconRegion類,提供了3個(gè)初始化方法:
//監(jiān)聽該UUID下的所有Beacon設(shè)備- (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID identifier:(NSString *)identifier;//監(jiān)聽該UUID,major下的所有Beacon設(shè)備- (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID major:(CLBeaconMajorValue)major identifier:(NSString *)identifier;//監(jiān)聽唯一的Beacon設(shè)備- (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID major:(CLBeaconMajorValue)major minor:(CLBeaconMinorValue)minor identifier:(NSString *)identifier;
在開始監(jiān)控之前,我們需要使用isMonitoringAvailableForClass判斷設(shè)備是否支持,是否允許訪問地理位置。
BOOL availableMonitor = [CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]];if (availableMonitor) { CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus]; switch (authorizationStatus) {case kCLAuthorizationStatusNotDetermined: [self.locationManager requestAlwaysAuthorization];break;case kCLAuthorizationStatusRestricted:case kCLAuthorizationStatusDenied: NSLog(@'受限制或者拒絕');break;case kCLAuthorizationStatusAuthorizedAlways:case kCLAuthorizationStatusAuthorizedWhenInUse:{ [self.locationManager startRangingBeaconsInRegion:self.beaconRegion]; [self.locationManager startMonitoringForRegion:self.beaconRegion];}break; }} else { NSLog(@'該設(shè)備不支持 CLBeaconRegion 區(qū)域檢測');}監(jiān)聽方式
可用兩種方式檢測區(qū)域Monitoring或Ranging方式
Monitoring:可以用來在設(shè)備進(jìn)入/退出某個(gè)地理區(qū)域時(shí)獲得通知, 使用這種方法可以在應(yīng)用程序的后臺運(yùn)行時(shí)檢測 iBeacon,但是只能同時(shí)檢測 20 個(gè) region 區(qū)域,并且不能夠推測設(shè)備與 iBeacon 的距離。
// 開始檢測區(qū)域[self.locationManager startMonitoringForRegion:beaconRegion]; // 停止檢測區(qū)域[self.locationManager stopMonitoringForRegion:beaconRegion]; // Monitoring成功對應(yīng)回調(diào)函數(shù)- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region;// 設(shè)備進(jìn)入該區(qū)域時(shí)的回調(diào)- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region;// 設(shè)備退出該區(qū)域時(shí)的回調(diào)- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region;// Monitoring有錯(cuò)誤產(chǎn)生時(shí)的回調(diào)- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(nullable CLRegion *)region withError:(NSError *)error;
Ranging:可以用來檢測某區(qū)域內(nèi)的所有 iBeacons。
// 開始檢測區(qū)域[self.locationManager startRangingBeaconsInRegion:beaconRegion];// 停止檢測區(qū)域[self.locationManager stopRangingBeaconsInRegion:beaconRegion];// Ranging成功對應(yīng)回調(diào)函數(shù)- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray<CLBeacon *> *)beacons inRegion:(CLBeaconRegion *)region // Ranging有錯(cuò)誤產(chǎn)生時(shí)的回調(diào)- (void)locationManager:(CLLocationManager *)manager rangingBeaconsDidFailForRegion:(CLBeaconRegion *)region withError:(NSError *)error進(jìn)程 kill 之后,進(jìn)入 iBeacon 區(qū)域的回調(diào)
// 當(dāng)程序被殺掉之后,進(jìn)入ibeacon區(qū)域,或者在程序運(yùn)行時(shí)鎖屏/解鎖 會回調(diào)此函數(shù)- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region爭取更多的后臺時(shí)間
必要時(shí),可以使用UIApplication類的- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler;方法,請求更多的后臺執(zhí)行時(shí)間。
[用 iPhone 手機(jī)模擬 iBeacon]任何支持使用藍(lán)牙低功耗共享數(shù)據(jù)的 iOS 設(shè)備都可以用作 iBeacon。
import <CoreBluetooth/CoreBluetooth.h>和<CoreLocation/CoreLocation.h>
在terminal中使用uuidgen命令,生成一個(gè) UUID 063FA845-F091-4129-937D-2A189A86D844。
其實(shí)利用BLE來模擬 beacon 設(shè)備發(fā)送信號,很簡單。
相關(guān)代碼初始化peripheralManager
self.peripheralManager= [[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:nil];
發(fā)送信號
NSUUID *proximityUUID = [[NSUUID alloc] initWithUUIDString:self.UUIDTextField.text];//創(chuàng)建beacon區(qū)域CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:proximityUUID major:self.majorTextField.text.integerValue minor:self.minorTextField.text.integerValue identifier:@'test'];NSDictionary *beaconPeripheraData = [beaconRegion peripheralDataWithMeasuredPower:nil];if(beaconPeripheraData) { [self.peripheralManager startAdvertising:beaconPeripheraData];;//開始廣播}
停止廣播
[self.peripheralManager stopAdvertising];注意點(diǎn) 需要訪問地理位置權(quán)限。 設(shè)備需要開啟藍(lán)牙。 利用 iOS 設(shè)備模擬 beacon信號,Home 出去之后是不能發(fā)送信號的。
以上就是如何在IOS中使用IBeacon的詳細(xì)內(nèi)容,更多關(guān)于IOS中IBeacon的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. JavaScript Reduce使用詳解2. 詳解JAVA 強(qiáng)引用3. 在JSP中使用formatNumber控制要顯示的小數(shù)位數(shù)方法4. 解決AJAX返回狀態(tài)200沒有調(diào)用success的問題5. Python TestSuite生成測試報(bào)告過程解析6. SpringBoot集成mqtt的多模塊項(xiàng)目配置詳解7. 深入了解JAVA 軟引用8. SpringBoot2.0集成MQTT消息推送功能實(shí)現(xiàn)9. IntelliJ IDEA設(shè)置默認(rèn)瀏覽器的方法10. SpringBoot集成Redisson實(shí)現(xiàn)延遲隊(duì)列的場景分析
