最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在IOS中使用IBeacon

 更新時間:2021年04月13日 14:49:44   作者:iOS雪碧  
這篇文章主要介紹了如何在IOS中使用IBeacon,想了解IBeacon的同學,一定要看一下

什么是iBeacon?

iBeacon 是蘋果公司2013年9月發(fā)布的移動設(shè)備用OS(iOS7)上配備的新功能。其工作方式是,配備有低功耗藍牙(BLE)通信功能的設(shè)備使用BLE技術(shù)向周圍發(fā)送自己特有的 ID,接收到該 ID 的應(yīng)用軟件會根據(jù)該 ID 采取一些行動。

從個人的角度看: iBeacon向四面八方不停地廣播信號,就像是往平靜的水面上扔了一塊石子,泛起層層漣漪(俗稱水波),波峰相當于 iBeacon 的RSSI(接受信號強度指示),越靠近中心點的地方波峰越高(RSSI 越大),這個波峰的大小(RSSI 的值)受到扔石子時用力大小(發(fā)射功率)和水質(zhì)(周圍環(huán)境因子)的影響,離中心點越遠水波越趨向于平靜,超過了一定值,水波會消失于無形,也就是說 iBeacon 向外廣播的距離是有范圍的,超過了這個范圍,將接受不到 iBeacon 的信號。

從iOS開發(fā)者的角度看: iBeacon 在 CoreLocation 框架中抽象為CLBeacon類, 該類有6個屬性,分別是:

  • proximityUUID,是一個 NSUUID,用來標識公司。每個公司、組織使用的 iBeacon 應(yīng)該擁有同樣的 proximityUUID。
  • major,主要值,用來識別一組相關(guān)聯(lián)的 beacon,例如在連鎖超市的場景中,每個分店的 beacon 應(yīng)該擁有同樣的 major。
  • minor,次要值,則用來區(qū)分某個特定的 beacon。
  • proximity,遠近范圍的,一個枚舉值。
  • typedef NS_ENUM(NSInteger, CLProximity) {
    	CLProximityUnknown,// 無效
    	CLProximityImmediate,//在幾厘米內(nèi)
    	CLProximityNear,//在幾米內(nèi)
    	CLProximityFar//超過 10 米以外,不過在測試中超不過10米就是far
    }
    
  • accuracy,與iBeacon的距離。
  • rssi,信號輕度為負值,越接近0信號越強,等于0時無法獲取信號強度。

Tip:proximityUUID,major,minor 這三個屬性組成 iBeacon 的唯一標識符。

只要進入iBeacon的范圍,就能喚醒 App(大約10秒鐘),即使在程序被殺掉的情況下。必要時,可以使用UIApplication類的- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler;方法,請求更多的后臺執(zhí)行時間。

iBeacon的用途:我們可以用iBeacon可以進行室內(nèi)定位(車庫,商場),智能打卡,提醒(離開某物體的時候,比如離開家)。

iBeacon 與 BLE 的區(qū)別

iOS 中 iBeacon 是基于地理位置的微定位技術(shù),雖然借助手機藍牙進行接收MajroMinor,但是他們在開發(fā)工程中沒有任何關(guān)系。

iBeacon使用蘋果提供CoreLocation庫,然而在 BLE 在開發(fā)過程中使用CoreBluetooth庫。從上面提供的庫來看就很清楚了,特別是在 iOS8.0 之后的時候如果想使用iBeacon,必須讓用戶點擊是否允許XXapp使用地理位置。如果在第一次使用 iOS App 掃描iBeacon的時候沒有提示這句話,是不可能接收到iBeacon的信號(除非iOS 8.0之下)。如果是 BLE 則的開發(fā)過程中之需要提示用戶打開藍牙,并不要求其他的地理位置任何信息。

iBeacon 在 iOS 中的運用

權(quán)限請求

info.plist中添加NSLocationAlwaysAndWhenInUseUsageDescription,NSLocationWhenInUseUsageDescription,NSLocationAlwaysUsageDescription,請求地理位置權(quán)限。

開啟Background Modes

相關(guān)代碼

import <CoreLocation/CoreLocation.h>。

初始化locationManagerbeaconRegion。

- (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個初始化方法:

//監(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ū)域MonitoringRanging方式

Monitoring:可以用來在設(shè)備進入/退出某個地理區(qū)域時獲得通知, 使用這種方法可以在應(yīng)用程序的后臺運行時檢測 iBeacon,但是只能同時檢測 20 個 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è)備進入該區(qū)域時的回調(diào)
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region;

// 設(shè)備退出該區(qū)域時的回調(diào)
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region;

// Monitoring有錯誤產(chǎn)生時的回調(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有錯誤產(chǎn)生時的回調(diào)
- (void)locationManager:(CLLocationManager *)manager rangingBeaconsDidFailForRegion:(CLBeaconRegion *)region withError:(NSError *)error

進程 kill 之后,進入 iBeacon 區(qū)域的回調(diào)

// 當程序被殺掉之后,進入ibeacon區(qū)域,或者在程序運行時鎖屏/解鎖 會回調(diào)此函數(shù)
- (void)locationManager:(CLLocationManager *)manager
      didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region

爭取更多的后臺時間

必要時,可以使用UIApplication類的- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler;方法,請求更多的后臺執(zhí)行時間。

[用 iPhone 手機模擬 iBeacon]

任何支持使用藍牙低功耗共享數(shù)據(jù)的 iOS 設(shè)備都可以用作 iBeacon。

import <CoreBluetooth/CoreBluetooth.h><CoreLocation/CoreLocation.h>

terminal中使用uuidgen命令,生成一個 UUID 063FA845-F091-4129-937D-2A189A86D844。

其實利用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];

注意點

  • 需要訪問地理位置權(quán)限。
  • 設(shè)備需要開啟藍牙。
  • 利用 iOS 設(shè)備模擬 beacon信號,Home 出去之后是不能發(fā)送信號的。

以上就是如何在IOS中使用IBeacon的詳細內(nèi)容,更多關(guān)于IOS中IBeacon的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • iOS捕捉截屏事件并展示截圖效果

    iOS捕捉截屏事件并展示截圖效果

    這篇文章主要為大家詳細介紹了iOS捕捉截屏事件并展示截圖效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • iOS打電話、發(fā)短信、發(fā)郵件實例代碼

    iOS打電話、發(fā)短信、發(fā)郵件實例代碼

    這篇文章主要為大家詳細介紹了iOS打電話、發(fā)短信、發(fā)郵件實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • iOS10適配問題點總結(jié)

    iOS10適配問題點總結(jié)

    升級到ios10遇到一系列問題,今天小編抽時間吧iOS10適配問題點整理分享給大家,感興趣的朋友可以參考下
    2016-09-09
  • iOS9 系統(tǒng)分享調(diào)用之UIActivityViewController

    iOS9 系統(tǒng)分享調(diào)用之UIActivityViewController

    UIActivityViewController類是一個標準的view controller,通個使用這個controller,你的應(yīng)用程序就可以提供各種服務(wù)。本文給大家介紹iOS9 系統(tǒng)分享調(diào)用之UIActivityViewController,感興趣的朋友一起學習吧
    2015-11-11
  • swift 常用高階函數(shù)分享

    swift 常用高階函數(shù)分享

    Swift是一門面向協(xié)議的語言,在使用Swift時我們已經(jīng)充分享受到了面向協(xié)議編程帶給我們的便利,但是Swift相比Obj-C還有一個更重要的優(yōu)點,那就是對函數(shù)式編程提供了很好的支持,其中Swift提供了map,filter,reduce這三個高階函數(shù)Higher Order function作為對容器的支持
    2017-12-12
  • iOS實現(xiàn)短信驗證碼倒計時

    iOS實現(xiàn)短信驗證碼倒計時

    這篇文章主要介紹了iOS實現(xiàn)短信驗證碼倒計時功能,一種方法是利用NSTimer計時器,另一種方法是利用GCD實現(xiàn)短信驗證碼倒計時,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • iOS開發(fā)之自定義UITextField的方法

    iOS開發(fā)之自定義UITextField的方法

    UITextField是IOS開發(fā)中用戶交互中重要的一個控件,常被用來做賬號密碼框,輸入信息框等。本文給大家介紹iOS開發(fā)之自定義UITextField的方法,感興趣的朋友一起學習吧
    2016-05-05
  • iOS中對文本的字符限制示例詳解

    iOS中對文本的字符限制示例詳解

    這篇文章主要給大家介紹了關(guān)于iOS中對文本的字符限制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06
  • iOS 四種回調(diào)方法總結(jié)

    iOS 四種回調(diào)方法總結(jié)

    這篇文章主要介紹了iOS 四種回調(diào)方法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • IOS UI學習教程之設(shè)置UITextField各種屬性

    IOS UI學習教程之設(shè)置UITextField各種屬性

    這篇文章主要為大家詳細介紹了IOS UI學習教程之設(shè)置UITextField各種屬性,感興趣的小伙伴們可以參考一下
    2016-03-03

最新評論

新蔡县| 伊宁县| 乌什县| 镇远县| 曲麻莱县| 酉阳| 和平县| 高碑店市| 信丰县| 长治市| 保康县| 濮阳县| 镇江市| 铜陵市| 新昌县| 衡山县| 延边| 沙坪坝区| 哈尔滨市| 凤冈县| 吴桥县| 田东县| 宣化县| 扬州市| 揭西县| 扶风县| 东台市| 桑植县| 开阳县| 玛纳斯县| 德化县| 墨竹工卡县| 广东省| 冷水江市| 垫江县| 新邵县| 枣庄市| 桃园市| 保德县| 剑川县| 定安县|