ibeacon使用(一)基础功能

ibeacon介绍

ibeacon通过信号发射器发出蓝牙信号,用于定位技术,通过进出围栏的方法还可以做一些报警装置,本身是不支持使用蓝牙指令,可以结合蓝牙进行操作。

ibeacon的主要数据组成

UUID、Major、Minor、Rssi、Proximity、Accuracy。

UUID: 通用唯一标识符,这个是ibeacon设备的唯一标识,搜索ibeacon设备时需要用到,一般公司产品uuid是一致的,这个固定uuid就是他们的产品,再通过Major和Minor进行不同设备区分
Major: 主要值,2个字节,用来区分相关联的一组beacon设备
Minor: 次要值,2个字节,用来确定某个设备
Rssi: 信号强度,和蓝牙的rssi是一样的,负数,越接近于0信号越强
Accuracy: 与设备之间的距离
Proximity: 设备的远近范围,是个枚举值

typedef NS_ENUM(NSInteger, CLProximity) {
    CLProximityUnknown,
    CLProximityImmediate,
    CLProximityNear,
    CLProximityFar
} API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(watchos, tvos);

major和minor不是必要的,可以用来携带一些信息,也可以用于确定唯一的设备。 ibeacon可以只靠uuid进行设备的确定,如果不知道自己设备的uuid、major和minor可以使用ibeacon扫描软件 (文末提供)

ibeacon使用

1. 导入头文件、添加定位权限

使用到定位的功能,需要导入CoreLocation框架、在info.plist中添加NSLocationAlwaysAndWhenInUseUsageDescription,NSLocationWhenInUseUsageDescription,NSLocationAlwaysUsageDescription,请求地理位置权限。

#import <CoreLocation/CoreLocation.h>

开启Background Modes

background fetch.png
2. 初始化locationManager和beaconRegion
- (id)init
{
    if (self = [super init]) {
        
        _locationManager = [[CLLocationManager alloc] init];
        [_locationManager requestAlwaysAuthorization];
        _locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
        _locationManager.delegate = self;
        //实时更新定位位置
        _locationManager.distanceFilter = kCLDistanceFilterNone;
        [_locationManager startUpdatingLocation];
        
        NSUUID *estimoteUUID = [[NSUUID alloc] initWithUUIDString:ibeaconDeviceUUID];
        if (@available(iOS 13.0, *)) {
            _beaconRegion = [[CLBeaconRegion alloc] initWithUUID:estimoteUUID identifier:@""];
            _beaconConstrait  = [[CLBeaconIdentityConstraint alloc] initWithUUID:estimoteUUID];
        }else{
            _beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:estimoteUUID identifier:@""];
        }
        _beaconRegion.notifyEntryStateOnDisplay = YES;//locationManager:didDetermineState:forRegion:方法通知
        _beaconRegion.notifyOnEntry = YES;//进入区域通知
        _beaconRegion.notifyOnExit = YES;//退出区域通知
        
    }
    return self;
}

CLBeaconRegion的notifyEntryStateOnDisplay、notifyOnEntry、notifyOnExit要设置为YES,Monitoring和Ranging的主要代理回调都需要

CLBeaconRegion有四种初始化的方法,这里写的是iOS13提供的,iOS13以下的方法有三种和以下四种类似,根据不同的业务需求选择不同的监控方式。

//iOS13
//监控该UUID下的所有Beacon设备
- (instancetype)initWithUUID:(NSUUID *)uuid identifier:(NSString *)identifier API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(watchos, tvos, macos);
//监控该UUID、Major下的所有Beacon设备
- (instancetype)initWithUUID:(NSUUID *)uuid major:(CLBeaconMajorValue)major identifier:(NSString *)identifier API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(watchos, tvos, macos);
//监控该UUID、Major、Minor下的所有Beacon设备
- (instancetype)initWithUUID:(NSUUID *)uuid major:(CLBeaconMajorValue)major minor:(CLBeaconMinorValue)minor identifier:(NSString *)identifier API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(watchos, tvos, macos);
//监控CLBeaconIdentityConstraint参数下的所以Beacon设备(iOS13新增的和前三种方法类似,设置UUID、Major和Minor)
- (instancetype)initWithBeaconIdentityConstraint:(CLBeaconIdentityConstraint *)beaconIdentityConstraint identifier:(NSString *)identifier API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(watchos, tvos, macos);

iOS13新增的CLBeaconIdentityConstraint对象,封装用于设置uuid、Major和Minor,所以很多方法在iOS13中做了修改,本文主要是使用iOS13的方法,iOS13以下的方法基本相同

3. 设置监控

监控之前要先判断设备是否支持地理位置请求

- (void)checkMonitoringAuth
{
    // 在开始监控之前,我们需要判断改设备是否支持,和区域权限请求
    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:{
                if (@available(iOS 13.0, *)) {
                    [self.locationManager startRangingBeaconsSatisfyingConstraint:self.beaconConstrait];
                }else{
                    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
                }
                [self.locationManager startMonitoringForRegion:self.beaconRegion];
            }
                break;
        }
    } else {
        NSLog(@"该设备不支持 CLBeaconRegion 区域检测");
    }
}

#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status  {
    if (status == kCLAuthorizationStatusAuthorizedAlways
        || status == kCLAuthorizationStatusAuthorizedWhenInUse) {
        if (@available(iOS 13.0, *)) {
            [self.locationManager startRangingBeaconsSatisfyingConstraint:self.beaconConstrait];
        }else{
            [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
        }
        [self.locationManager startMonitoringForRegion:self.beaconRegion];
    }
}
4.监控方式

有两种监听方式Monitoring或Ranging方式
-(void)startMonitoringForRegion:(CLRegion *)region API_AVAILABLE(ios(5.0), macos(10.8)) API_UNAVAILABLE(watchos, tvos);
- (void)startRangingBeaconsSatisfyingConstraint:(CLBeaconIdentityConstraint *)constraint API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(watchos, tvos, macos);

Monitoring

主要用于设备进入和退出某个地理区域会收到回调,可在后台运行时进行检查iBeacon,搭配蓝牙可实现很多功能,1个App最多能同时监控20个region

1.不能获取CLBeacon对象,也就不能读取到accuracy、rssi等数据 2.最好不要用于通过退出区域来判断iBeacon设备是否关闭,iBeacon设备关闭后,退出区域回调比较慢才收到

主要使用的方法是进入和离开区域,可在后台使用,可以用来唤醒App。

#pragma mark -- Monitoring
/** 进入区域 */
- (void)locationManager:(CLLocationManager *)manager
         didEnterRegion:(CLRegion *)region  {
}


/** 离开区域 */
- (void)locationManager:(CLLocationManager *)manager
          didExitRegion:(CLRegion *)region  {
}


/** Monitoring有错误产生时的回调 */
- (void)locationManager:(CLLocationManager *)manager
monitoringDidFailForRegion:(nullable CLRegion *)region
              withError:(NSError *)error {
}

/** Monitoring 成功回调 */
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
}
Ranging

可以用来检测某区域内你所监控的iBeacons

//iOS13上的方法

/** 1秒钟执行1次 */ //进入和离开、点亮屏幕也会调这个方法
- (void)locationManager:(CLLocationManager *)manager
     didRangeBeacons:(NSArray<CLBeacon *> *)beacons
satisfyingConstraint:(CLBeaconIdentityConstraint *)beaconConstraint
{
    for (CLBeacon *beacon in beacons) {
        NSLog(@" rssi is :%ld",(long)beacon.rssi);
        NSLog(@" beacon proximity :%ld",(long)beacon.proximity);
        NSLog(@" accuracy : %f",beacon.accuracy);
        NSLog(@" proximityUUID : %@",beacon.UUID.UUIDString);
        NSLog(@" major :%ld",(long)beacon.major.integerValue);
        NSLog(@" minor :%ld",(long)beacon.minor.integerValue);
    }
}

/** ranging有错误产生时的回调  */
- (void)locationManager:(CLLocationManager *)manager
didFailRangingBeaconsForConstraint:(CLBeaconIdentityConstraint *)beaconConstraint
                  error:(NSError *)error{
    
}

Demo地址

本文的demo:ibeaconDemo
github上找的用于beacon扫描: BeaconScanner

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354