1、什么是iBeacon?

iBeacon 是苹果公司在 iOS 7 中新推出的一种近场定位技术,可以感知一个附近的 iBeacon 信标的存在。

当一个 iBeacon 兼容设备进入/退出一个 iBeacon 信标标识的区域时,iOS 和支持 iBeacon 的 app 就能得知这一信息,从而对用户发出相应的通知。

典型的应用场景例如博物馆实时推送附近展品的相关信息,商场内即时通知客户折扣信息等。苹果在 Apple Store 中也部署了 iBeacon 来推送优惠、活动信息。还可以应用的使用场景是将某个 iBeacon 发射器安装在你的电脑包、钱包甚至是你的猫的项圈上——即任何你不想丢失的重要物件。一旦你的设备离开发射器的范围,你的应用就会检测到并通知你。

2、UUID、主要、次要标识符

iBeacon 本质上来说是一个位置(区域)信息,所以 Apple 把 iBeacon 功能集成在了 Core Location 里面。
iBeacon 信标在 Core Location 中表现为一个 CLBeacon,它圈定的范围则表现为 CLBeaconRegion,这是一个 CLRegion 的子类。

CLBeaconRegion 主要用三个属性来标识一个 iBeacon,proximityUUIDmajor 和 minor

iBeacon 在 CoreLocation 框架中抽象为CLBeacon类, 该类有6个属性,分别是:

  • proximityUUID,是一个 NSUUID,用来标识公司。每个公司、组织使用的 iBeacon 应该拥有同样的 proximityUUID。

  • major,主要值,用来识别一组相关联的 beacon,例如在连锁超市的场景中,每个分店的 beacon 应该拥有同样的 major。

  • minor,次要值,则用来区分某个特定的 beacon。

  • proximity,远近范围的,一个枚举值。

    typedef NS_ENUM(NSInteger, CLProximity) {

    CLProximityUnknown,// 无效

    CLProximityImmediate,//在几厘米内

    CLProximityNear,//在几米内

    CLProximityFar//超过 10 米以外,不过在测试中超不过10米就是far

    }

  • accuracy,与iBeacon的距离。

  • rssi,信号轻度为负值,越接近0信号越强,等于0时无法获取信号强度。

这些属性如果不指定(即 nil),匹配的时候就会忽略这个属性。例如只指定 proximityUUID 的 CLBeaconRegion 可以匹配某公司的所有 beacons。

只要进入iBeacon的范围,就能唤醒 App(大约10秒钟),即使在程序被杀掉的情况下。必要时,可以使用UIApplication类的- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler;方法,请求更多的后台执行时间。

3、使用iOS设备作为iBeacon

如果手头没有iBeacon设备,任何支持蓝牙低功耗的IOS设备都可以作为iBeacon。

1.初始化peripheralManager

self.peripheralManager = [[CBPeripheralManageralloc] initWithDelegate:selfqueue:dispatch_get_main_queue() options:@{}];

CLBeaconRegion *beaconRegion = [[CLBeaconRegionalloc] initWithProximityUUID:[[NSUUIDalloc] initWithUUIDString:Beacon_Device_UUID] major:9999 minor:8888 identifier:@"0000"];

2.实现代理协议

- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral {

NSLog(@"didUpdateState: peripheralState=%ld", (long)peripheral.state);

if (peripheral.state == CBManagerStatePoweredOn) {

[self hopPayload];

}

}

- (void)hopPayload {

if ([self.peripheralManagerisAdvertising]) {

[self.peripheralManagerstopAdvertising];

}

NSDictionary *beaconPeripheraData = [self.beaconRegion11 peripheralDataWithMeasuredPower:@(-50)];

[_peripheralManager startAdvertising:beaconPeripheraData];

}

3、相关代码

请求用户授权 (需要在info.plist文件中添加相关的权限 Privacy - Location Always Usage Description、Privacy - Location When In Use Usage Description、Privacy - Location Always and When In Use Usage Description)

引入 #import <CoreLocation/CoreLocation.h>

NSString * const Beacon_Device_UUID = @"E2C56DB5-DFFB-48D2-B060-D0F5A71096E0";

 

@property (strong, nonatomic) CLLocationManager *locationManager;

@property (strong, nonatomic) CLBeaconRegion *beaconRegion;

1.判断用户权限

    BOOL availableMonitor = [CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]];

    if (availableMonitor) {

        CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];

        switch (authorizationStatus) {

            case kCLAuthorizationStatusNotDetermined:

            {

                NSLog(@"这台设备可以检测到周围的beacon");

                [self.locationManager requestAlwaysAuthorization];

            }

                break;

            case kCLAuthorizationStatusRestricted:

            case kCLAuthorizationStatusDenied:

                NSLog(@"受限制或者拒绝");

                break;

            case kCLAuthorizationStatusAuthorizedAlways:

            case kCLAuthorizationStatusAuthorizedWhenInUse:

                [self startMonitoring];

                break;

        }

    } else {

        NSLog(@"该设备不支持 CLBeaconRegion 区域检测");

    }

2.创建CLLocationManager对象

_locationManager = [[CLLocationManager alloc] init];

_locationManager.delegate = self;

3.创建圈定的范围区域对象CLBeaconRegion

 _beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:Beacon_Device_UUID] identifier:@"test"];

根据需求用那种方式创建:

// 仅使用proximityUUID来初始化区域,major,minor值将作为通配符。只要是区域内的iBeacon的proximityUUID与此proximityUUID相同,不管major, minor是什么值,都能被检测到。

- (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID identifier:(NSString *)identifier;

//使用proximityUUID和major来初始化区域,minor值将作为通配符。区域内的iBeacon的proximityUUID和major与此proximityUUID和major相同时,不论minor为何值,都能被检测到。

- (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID major:(CLBeaconMajorValue)major identifier:(NSString *)identifier;

//使用proximityUUID, major, minor来初始化,只能检测到区域内相同proximityUUID, major, minor的iBeacon设备。

- (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID major:(CLBeaconMajorValue)major minor:(CLBeaconMinorValue)minor identifier:(NSString *)identifier;

4.可用两种方式检测区域 Monitoring或Ranging方式

第一种:

[self.locationManager startMonitoringForRegion:self.beaconRegion];

#pragma mark - Monitoring:可以用来在设备进入/退出某个地理区域时获得通知, 使用这种方法可以在应用程序的后台运行时检测 iBeacon,但是只能同时检测 20 个 region 区域,并且不能够推测设备与 iBeacon 的距离。

// Monitoring成功对应回调函数

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(nonnull CLRegion *)region {

    NSLog(@"Monitoring成功");

}

 

// Monitoring有错误产生时的回调

- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(nullable CLRegion *)region withError:(nonnull NSError *)error {

    NSLog(@"Failed monitoring region: %@", error);

}

 

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {

    NSLog(@"Location manager failed: %@", error);

}

 

// 设备退出该区域时的回调

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {

    NSLog(@"设备出了你的范围了");

}

 

// 设备进入该区域时的回调

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region

{

    NSLog(@"设备进入你的范围了");

    NSLog(@"*******enter region:%@",region.identifier);

}

第二种:

[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];

#pragma mark -- Ranging:可以用来检测某区域内的所有 iBeacons

//manager监测当前进入范围的beacon

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {

}

GitHub地址:https://github.com/KunlunLu/BeaconDemo

也可参考:http://www.cocoachina.com/ios/20180211/22253.html

https://www.cnblogs.com/yangmx/p/3722795.html

转载于:https://www.cnblogs.com/lukunlun/p/8528699.html

iOS iBeacon 使用相关推荐

  1. iBeacon工作原理(How do iBeacon work?)

    ---------------------------------------------------------------------------------------------------- ...

  2. 寻宝游戏 - 利用iBeacon特性设计的iOS线下寻宝游戏 - 物联网小游戏

    寻宝游戏 - 利用iBeacon特性设计的iOS线下寻宝游戏 作者简介 科科香,程序员 方向:IoT,方案集成,喜好各种新鲜东东 转载请注明出处 iBeacon简介 iBeacon(下面简称Beaco ...

  3. 蓝牙4.0BLE之iBeacon 在ios上的应用-室内定位 [原创,多图,视频]

    笔者手机上装了很多App store上的蓝牙4.0 BLE的软件, 其中 AirLocate 是苹果公司推出iBeacon的测试软件,  Locate iBeacons 是一款第三方的软件, 能实现i ...

  4. android要比ios耗电,Aislelabs:苹果iOS版iBeacon比Android版更耗电

    研究发现,Moto G的电池续航时间最佳.比较低标记信号强度上的Nexus 5和iPhone 5系列手机(两者使用类似的低功耗蓝牙芯片),Nexus的电池消耗水平要稍低一些.随着信号强度的增加,两者的 ...

  5. android蓝牙4.0(BLE)开发之ibeacon初步

    一个april beacon里携带的信息如下 ? 1 <code class=" hljs ">0201061AFF4C0002159069BDB88C11416BAC ...

  6. iOS之深入解析操作系统的架构

    一.iOS 系统架构层次 在 iOS 中,框架是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像.声音文件等其它资源.共享资源库定义应用程序可以调用的函数和方法. iOS 为 ...

  7. iOS 应用安全权威指南电子书 PDF 分享

    目录 推荐序 V 译者序 VII 作者简介 IX 前言 XI 致谢 XXI 第一部分 iOS 基础 第1 章 iOS 安全模型 2 安全启动 3 沙盒机制 3 数据保护和全盘加密 4 加密密钥的层级 ...

  8. iOS 7开源项目干货集合

    http://www.cocoachina.com/applenews/devnews/2013/1024/7234.html iOS 7 GUI PSD 加拿大多伦多设计公司Teehan+Lax为A ...

  9. iOS开发 蓝牙技术4.0详解

    前言 前端时间,同学在做项目过程中遇到关于蓝牙方面的问题,今天我就给大家进行详细的进行讲解下蓝牙在iOS开发中的具体实现.在介绍蓝牙前,大家要搞清楚什么是蓝牙? 什么是蓝牙? 随着蓝牙低功耗技术BLE ...

最新文章

  1. 031_vue编程式导航
  2. 读WAF与IPS的区别总结之摘抄
  3. 我的工作网怎么样_分享一下我在珍爱网的相亲经历
  4. html自动适应屏幕分辨率,css如何自适应屏幕大小?
  5. 云卓遥控器+DIY高清摄像机的方案(完美接入原系统)
  6. 金融数据分析之财务分析表要填数据怎么办?(学习理财课程后开发的助手工具)
  7. php ci get,CI框架查询语法
  8. python label字体_Matplotlib xlabel,Arial格式,带一个斜体字
  9. 敏捷开发之利刃—db4o
  10. 基于华为产品的高校云数据中心建设规划设计方案
  11. 引用阿里图标库(iconFont)的三种方式
  12. 【Hive】Hive 建表语句详解
  13. 2022全国大学生数学建模竞赛获奖难么?国赛求解过程技巧及方案
  14. 基于8086方波锯齿波三角波发生器仿真、基于8086的LCD1602显示仿真设计、基于8086的LED点阵汉字流水显示设计、基于8086的LED中文显示屏显示设计-仿真设计资料【转发】
  15. yum源修改为本地光盘镜像
  16. Java——继承的概念
  17. NCBI上基因前面有个accession(编号)分别有NC是什么意思
  18. TFTP协议解析及C/C++代码实现
  19. 系统渗透与防护——信息收集与暴力破解
  20. python余弦定理_余弦定理与文本相似度

热门文章

  1. mysql全文检索优化_mysql全文检索 实现搜索优化
  2. 纯HTML、CSS写一个简单的水滴特效,水滴里面可加图标
  3. 昂首那瞬间,球已停止转动——HTML5实现3D球效果
  4. GB50204-2015混凝土结构工程施工质量验收规范
  5. 10.修改sysctl.conf提示没权限
  6. Java包装器类的作用好处及图解
  7. HoG梯度方向直方图总结
  8. 基于JavaSwing写的雷霆战机(飞机大战)
  9. windows server 几大实时同步软件比较
  10. ubuntu linux 启动 黑屏 进入紧急模式 emergency