iOS iBeacon開(kāi)發(fā)筆記

2015.10.19

airlocate 本文摘抄加個(gè)人總結(jié)

=========

airlocate顯示如何使用這個(gè)監(jiān)控范圍clbeaconregions敛助。

代碼還提供了一個(gè)例子止潘,你如何能校準(zhǔn)和配置iOS設(shè)備作為信標(biāo)corebluetooth芒帕。

您可以配置一個(gè)iOS設(shè)備作為信標(biāo)如下:

1)獲得兩個(gè)iOS設(shè)備配備藍(lán)牙LE。一個(gè)將是目標(biāo)設(shè)備绊寻,一個(gè)將是一個(gè)遠(yuǎn)程(校準(zhǔn))設(shè)備馏予。

2)負(fù)載和啟動(dòng)這個(gè)應(yīng)用程序在這兩個(gè)設(shè)備上。

3)通過(guò)選擇配置和打開(kāi)啟用的開(kāi)關(guān)戚丸,將目標(biāo)設(shè)備轉(zhuǎn)為信標(biāo)。

4)取校準(zhǔn)裝置科吭,并將一米距離的目標(biāo)設(shè)備移動(dòng)昏滴。

5)在校準(zhǔn)裝置上通過(guò)選擇校準(zhǔn)校準(zhǔn)過(guò)程。

6)從表格視圖中選擇目標(biāo)設(shè)備对人。

7)校準(zhǔn)過(guò)程將開(kāi)始用含。你應(yīng)該在這一過(guò)程中昭娩,在這個(gè)過(guò)程中鸟废,從一邊到另一邊的校準(zhǔn)裝置的波塔猾。

8)當(dāng)校準(zhǔn)過(guò)程完成后必搞,它會(huì)顯示一個(gè)校準(zhǔn)的RSSI值在屏幕上。

9)在目標(biāo)設(shè)備上没佑,返回到配置屏幕并輸入該值在測(cè)量功率下原叮。

注:校準(zhǔn)過(guò)程是可選的,但建議將微調(diào)范圍為您的環(huán)境咱台。

您可以配置一個(gè)iOS設(shè)備沒(méi)有校準(zhǔn)它不指定測(cè)量功率信標(biāo)络拌。

如果未指定測(cè)量功率,CoreLocation默認(rèn)為預(yù)定值回溺。

一旦你設(shè)置你的目標(biāo)設(shè)備作為一個(gè)燈塔春贸,你可以使用這個(gè)應(yīng)用程序演示燈塔范圍和監(jiān)測(cè)。

要演示范圍遗遵,選擇遠(yuǎn)程設(shè)備萍恕。alrangingviewcontroller范圍一套clbeaconregions。

要演示監(jiān)控车要,選擇遠(yuǎn)程設(shè)備監(jiān)控允粤。almonitoringviewcontroller允許您配置一個(gè)clbeaconregion監(jiān)測(cè)。

版權(quán)所有(2013)蘋果公司保留所有權(quán)利翼岁。

零.寫在前面

關(guān)于測(cè)試:建議下載Estimote的app类垫,作為基站,得到它的UUID琅坡,majon阔挠,minor參數(shù)。

關(guān)于設(shè)備:iBeacon 使用Bluetooth

LE技術(shù)脑蠕,所以你必須要有一個(gè)內(nèi)置有低功耗藍(lán)牙的 iOS 設(shè)備以便與 iBeacon協(xié)同工作购撼。目前這個(gè)列表里包含如下一些設(shè)備:

iPhone 4s 或更新的

第三代 iPad 或更新的

iPad mini 或更新的

第五代iPod touch 或更新的

系統(tǒng)版本7.0以上

測(cè)試結(jié)果:rssi信號(hào)輕度大概到-90,有效距離大概為30m谴仙。

用途:藍(lán)牙BLE迂求,定位,智能家居等晃跺。自己還做了個(gè)上班打卡的

app揩局,只有進(jìn)入有效范圍內(nèi)才能打卡成功。

UUID掀虎、主要凌盯、次要標(biāo)識(shí)符

如果你不熟悉 iBeacon,你可能也不熟悉術(shù)語(yǔ)UUID烹玉、主要值(major

value)和次要值(minor value)驰怎。

一個(gè) iBeacon除了是一個(gè)低功耗藍(lán)牙設(shè)備之外什么也不是,它們以特定結(jié)構(gòu)發(fā)布信息二打。這些特定的東西超出本教程的范圍县忌,但要明白的一件重要事情是 iOS之所以能夠監(jiān)控這些 iBeacon 就是基于UUID、主要值和次要值。

UUDID 是 Universally UniqueIdentifier(通用唯一標(biāo)識(shí)符)的縮寫症杏,它實(shí)際上是一個(gè)隨機(jī)字符串装获;B558CBDA-4472-4211-A350-FF1196FFE8C8就是一個(gè)例子。在 iBeacon 的討論范圍里厉颤,一個(gè) UUID 通常用于表示你的頂層標(biāo)識(shí)穴豫。作為開(kāi)發(fā)者如果你生成一個(gè) UUID并將其分配給你的 iBeacon 設(shè)備,那么當(dāng)一個(gè)設(shè)備檢測(cè)到你的 iBeacon 時(shí)逼友,它就知道它是在和哪個(gè) iBeacon通信精肃。

主要值與次要值在 UUID 之上提供了稍多的粒度。這些值只是 16 位無(wú)符號(hào)整數(shù)翁逞,能夠標(biāo)識(shí)每個(gè)單獨(dú)的 iBeacon

肋杖,甚至是具有同樣 UUID 的哪些。

舉個(gè)例子挖函,如果你有多間百貨公司状植,那么你所有的 iBeacon 發(fā)射器都可有同一個(gè) UUID

,但每個(gè)店都有它自己的主要值怨喘,而里面的每個(gè)部門就會(huì)有它自己的次要值津畸。你的應(yīng)用能夠?qū)σ粋€(gè)位于你在邁阿密、佛羅里達(dá)店的鞋類部們里的

iBeacon 做出響應(yīng)必怜。

一.iBeacon的使用

開(kāi)始監(jiān)聽(tīng)你的Ibeacon肉拓。

在iOS8里面蘋果改變了地位的開(kāi)啟方式(iBeacon的使用是基于藍(lán)牙和定位的),首先要在工程里的info.plist增加字段NSLocationAlwaysUsageDescription(這個(gè)是允許一直在后臺(tái)運(yùn)行的)

可能你會(huì)有些奇怪 iBeacon 會(huì)與 Core Location 相關(guān)梳庆,畢竟它是藍(lán)牙設(shè)備暖途,但考慮到 iBeacon

提供微定位信息對(duì)應(yīng) GPS 提供宏定位信息,也就不奇怪了膏执。在將一個(gè) iOS 設(shè)備當(dāng)作一個(gè)iBeacon 而編程時(shí)驻售,你就要利用 Core

Bluetooth 框架,而在監(jiān)控 iBeacon 時(shí)更米,你只需同 Core Location 打交道欺栗。

當(dāng)程序運(yùn)行起來(lái)你會(huì)發(fā)現(xiàn),設(shè)備左下角有你的程序 icon 圖標(biāo)

.h文件

#import

#import

@interface ViewController : UIViewController

@property (nonatomic, strong) NSArray

*beaconArr;//存放掃描到的iBeacon

@property (strong, nonatomic) CLBeaconRegion

*beacon1;//被掃描的iBeacon

@property (strong, nonatomic) CLLocationManager *

locationmanager;

@end

.m文件

#define BEACONUUID

@"12334566-7173-4889-9579-954995439125"http://iBeacon的uuid可以換成自己設(shè)備的uuid

- (void)viewDidLoad {

[super viewDidLoad];

self.tableView = [[UITableView alloc]

initWithFrame:CGRectMake(0, 20, 320, 568)];

self.tableView.delegate = self;

self.tableView.dataSource = self;

[self.view addSubview:self.tableView];

self.beaconArr = [[NSArray alloc] init];

self.locationmanager = [[CLLocationManager alloc]

init];//初始化

self.locationmanager.delegate = self;

self.beacon1 = [[CLBeaconRegion alloc]

initWithProximityUUID:[[NSUUID alloc]

initWithUUIDString:BEACONUUID]

identifier:@"media"];//初始化監(jiān)測(cè)的iBeacon信息

[self.locationmanagerrequestAlwaysAuthorization];//設(shè)置location是一直允許

}

- (void)locationManager:(CLLocationManager *)managerdidChangeAuthorizationStatus:(CLAuthorizationStatus)status{

if (status == kCLAuthorizationStatusAuthorizedAlways) {

[self.locationmanagerstartMonitoringForRegion:self.beacon1];//開(kāi)始MonitoringiBeacon

}

}

{

//發(fā)現(xiàn)有iBeacon進(jìn)入監(jiān)測(cè)范圍

-(void)locationManager:(CLLocationManager *)manager

didEnterRegion:(CLRegion *)region{

[self.locationmanagerstartRangingBeaconsInRegion:self.beacon1];//開(kāi)始RegionBeacons

}

//找的iBeacon后掃描它的信息

- (void)locationManager:(CLLocationManager *)manager

didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion

*)region{

//如果存在不是我們要監(jiān)測(cè)的iBeacon那就停止掃描他

if (![[region.proximityUUID UUIDString]

isEqualToString:BEACONUUID]){

[self.locationmanager stopMonitoringForRegion:region];

[self.locationmanager stopRangingBeaconsInRegion:region];

}

//打印所有iBeacon的信息

for (CLBeacon* beacon in beacons) {

NSLog(@"rssi is :%ld",beacon.rssi);

NSLog(@"beacon.proximity %ld",beacon.proximity);

......

}

self.beaconArr = beacons;

[self.tableView reloadData];

}

- (NSInteger)tableView:(UITableView *)tableView

numberOfRowsInSection:(NSInteger)section

{

return self.beaconArr.count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView

cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *ident = @"cell";

UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:ident];

if (!cell) {

cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:ident];

}

CLBeacon *beacon = [self.beaconArr

objectAtIndex:indexPath.row];

cell.textLabel.text = [beacon.proximityUUID UUIDString];

NSString *str;

switch (beacon.proximity) {

case CLProximityNear:

str = @"近";

break;

case CLProximityImmediate:

str = @"超近";

break;

case CLProximityFar:

str = @"遠(yuǎn)";

break;

case CLProximityUnknown:

str = @"不見(jiàn)了";

break;

default:

break;

}

cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ %ld

%@ %@",str,beacon.rssi,beacon.major,beacon.minor];

return cell;

}

//一些錯(cuò)誤處理征峦,因?yàn)槟阏谕浅>唧w的硬件特性打交道迟几,你需要知道任何原因?qū)е碌谋O(jiān)控和測(cè)距失敗

- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error {NSLog(@"Failed monitoring region:%@", error);}- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {NSLog(@"Location manager failed:%@", error);

}

二.ibeacon的參數(shù)

uuid唯一標(biāo)識(shí)此類iBeacon。

proximity遠(yuǎn)近范圍的栏笆,有Near(在幾米內(nèi))类腮,Immediate(在幾厘米內(nèi)),F(xiàn)ar(超過(guò) 10

米以外竖伯,不過(guò)在測(cè)試中超不過(guò)10米就是far)存哲,Unknown(無(wú)效)

major和minor組合后區(qū)分同一類型下的iBeacon因宇。

accuracy和iBeacon的距離

rssi信號(hào)輕度為負(fù)值七婴,越接近0信號(hào)越強(qiáng)祟偷,等于0時(shí)無(wú)法獲取信號(hào)強(qiáng)度

三.通知

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {if ([regionisKindOfClass:[CLBeaconRegionclass]]) {? ? ? ? UILocalNotification *notification = [[UILocalNotificationalloc]init];? ? ? ? notification.alertBody =@"Are you forgetting something?";? ? ? ? notification.soundName =@"Default";? ? ? ? [[UIApplicationsharedApplication]presentLocalNotificationNow:notification];? ? }}

你的位置管理器將在你離開(kāi)某個(gè)區(qū)域時(shí)調(diào)用上面的方法,這就是這個(gè)應(yīng)用有用的時(shí)刻打厘。你不需要在你接近你的電腦包時(shí)被告知修肠,只需在你離開(kāi)它太遠(yuǎn)時(shí)通知你。

此處你檢查區(qū)域是否是一個(gè)CLBeaconRegion户盯,因?yàn)槿绻阃瑫r(shí)也在執(zhí)行地理定位區(qū)域監(jiān)視的話嵌施,它還可能是一個(gè)CLCircularRegion。然后你就發(fā)送一個(gè)本地通知莽鸭,附帶一個(gè)消息“Are you forgetting something?” 吗伤。

編譯并運(yùn)行你的應(yīng)用;離開(kāi)某個(gè)你的注冊(cè)的 iBeacon硫眨,然后一旦你離開(kāi)得足夠遠(yuǎn)足淆,你就會(huì)看到通知彈出來(lái)。

參考地址:https://github.com/nixzhu/dev-blog/blob/master/2014-04-23-ios7-ibeacons-tutorial.md

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末礁阁,一起剝皮案震驚了整個(gè)濱河市巧号,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姥闭,老刑警劉巖丹鸿,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異棚品,居然都是意外死亡靠欢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門铜跑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)门怪,“玉大人,你說(shuō)我怎么就攤上這事疼进⌒嚼拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵伞广,是天一觀的道長(zhǎng)拣帽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嚼锄,這世上最難降的妖魔是什么减拭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮区丑,結(jié)果婚禮上拧粪,老公的妹妹穿的比我還像新娘修陡。我一直安慰自己,他們只是感情好可霎,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布魄鸦。 她就那樣靜靜地躺著,像睡著了一般癣朗。 火紅的嫁衣襯著肌膚如雪拾因。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天旷余,我揣著相機(jī)與錄音绢记,去河邊找鬼。 笑死正卧,一個(gè)胖子當(dāng)著我的面吹牛蠢熄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炉旷,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼签孔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了砾跃?” 一聲冷哼從身側(cè)響起骏啰,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抽高,沒(méi)想到半個(gè)月后判耕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翘骂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年壁熄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碳竟。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡草丧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莹桅,到底是詐尸還是另有隱情昌执,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布诈泼,位于F島的核電站懂拾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏铐达。R本人自食惡果不足惜岖赋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓮孙。 院中可真熱鬧唐断,春花似錦选脊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至斤程,卻和暖如春角寸,著一層夾襖步出監(jiān)牢的瞬間菩混,已是汗流浹背忿墅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沮峡,地道東北人疚脐。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像邢疙,于是被迫代替她去往敵國(guó)和親棍弄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容