如何在IOS中使用IBeacon

什么是iBeacon?

iBeacon 是苹果公司2013年9月发布的移动设备用OS(iOS7)上配备的新功能。其工作方式是,配备有低功耗蓝牙(BLE)通信功能的设备使用BLE技术向周围发送自己特有的 ID,接收到该 ID 的应用软件会根据该 ID 采取一些行动。

从个人的角度看: iBeacon向四面八方不停地广播信号,就像是往平静的水面上扔了一块石子,泛起层层涟漪(俗称水波),波峰相当于 iBeacon 的RSSI(接受信号强度指示),越靠近中心点的地方波峰越高(RSSI 越大),这个波峰的大小(RSSI 的值)受到扔石子时用力大小(发射功率)和水质(周围环境因子)的影响,离中心点越远水波越趋向于平静,超过了一定值,水波会消失于无形,也就是说 iBeacon 向外广播的距离是有范围的,超过了这个范围,将接受不到 iBeacon 的信号。

从iOS开发者的角度看: 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时无法获取信号强度。

Tip:proximityUUIDmajorminor 这三个属性组成 iBeacon 的唯一标识符。

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

iBeacon的用途:我们可以用iBeacon可以进行室内定位(车库,商场),智能打卡,提醒(离开某物体的时候,比如离开家)。

iBeacon 与 BLE 的区别

iOS 中 iBeacon 是基于地理位置的微定位技术,虽然借助手机蓝牙进行接收MajroMinor,但是他们在开发工程中没有任何关系。

iBeacon使用苹果提供CoreLocation库,然而在 BLE 在开发过程中使用CoreBluetooth库。从上面提供的库来看就很清楚了,特别是在 iOS8.0 之后的时候如果想使用iBeacon,必须让用户点击是否允许XXapp使用地理位置。如果在第一次使用 iOS App 扫描iBeacon的时候没有提示这句话,是不可能接收到iBeacon的信号(除非iOS 8.0之下)。如果是 BLE 则的开发过程中之需要提示用户打开蓝牙,并不要求其他的地理位置任何信息。

iBeacon 在 iOS 中的运用

权限请求

info.plist中添加NSLocationAlwaysAndWhenInUseUsageDescription,NSLocationWhenInUseUsageDescriptionNSLocationAlwaysUsageDescription,请求地理位置权限。

开启Background Modes

相关代码

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

//监听该UUID下的所有Beacon设备
- (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID identifier:(NSString *)identifier;

//监听该UUID,major下的所有Beacon设备
- (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID major:(CLBeaconMajorValue)major identifier:(NSString *)identifier;

//监听唯一的Beacon设备
- (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID major:(CLBeaconMajorValue)major minor:(CLBeaconMinorValue)minor identifier:(NSString *)identifier;

在开始监控之前,我们需要使用isMonitoringAvailableForClass判断设备是否支持,是否允许访问地理位置。

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(@"该设备不支持 CLBeaconRegion 区域检测");
}

监听方式

可用两种方式检测区域MonitoringRanging方式

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

// 开始检测区域
[self.locationManager startMonitoringForRegion:beaconRegion]; 

// 停止检测区域
[self.locationManager stopMonitoringForRegion:beaconRegion]; 

// Monitoring成功对应回调函数
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region;

// 设备进入该区域时的回调
- (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;

Ranging:可以用来检测某区域内的所有 iBeacons。

// 开始检测区域
[self.locationManager startRangingBeaconsInRegion:beaconRegion];

// 停止检测区域
[self.locationManager stopRangingBeaconsInRegion:beaconRegion];

// Ranging成功对应回调函数
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray<CLBeacon *> *)beacons inRegion:(CLBeaconRegion *)region 

// Ranging有错误产生时的回调
- (void)locationManager:(CLLocationManager *)manager rangingBeaconsDidFailForRegion:(CLBeaconRegion *)region withError:(NSError *)error

进程 kill 之后,进入 iBeacon 区域的回调

// 当程序被杀掉之后,进入ibeacon区域,或者在程序运行时锁屏/解锁 会回调此函数
- (void)locationManager:(CLLocationManager *)manager
      didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region

争取更多的后台时间

必要时,可以使用UIApplication类的- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler;方法,请求更多的后台执行时间。

[用 iPhone 手机模拟 iBeacon]

任何支持使用蓝牙低功耗共享数据的 iOS 设备都可以用作 iBeacon

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

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

其实利用BLE来模拟 beacon 设备发送信号,很简单。

相关代码

初始化peripheralManager

self.peripheralManager= [[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:nil];

发送信号

NSUUID *proximityUUID = [[NSUUID alloc] initWithUUIDString:self.UUIDTextField.text];
//创建beacon区域
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];

注意点

  • 需要访问地理位置权限。
  • 设备需要开启蓝牙。
  • 利用 iOS 设备模拟 beacon信号,Home 出去之后是不能发送信号的。

以上就是如何在IOS中使用IBeacon的详细内容,更多关于IOS中IBeacon的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android基于ibeacon实现蓝牙考勤功能

    说明: ibeacon设备会主动发射蓝牙信号,当手机打开蓝牙靠近ibeacon设备时,就会收到设备发送的蓝牙信号,这时只需要根据ibeacon设备的uuid.major.minor.mac这四个值,就可以确认是哪一台ibeacon设备,然后调用服务端考勤接口(ibeacon设备只为了确认手机在考勤机边上,不需要发送考勤数据到ibeacon设备上),即可实现蓝牙考勤. 一.添加静态权限(在AndroidManifest.xml文件中添加,需要蓝牙和定位权限) <uses-permission an

  • Android检测IBeacon热点的方法

    IBeacon是BLE的一种,搜索iBeacon基站关键在于设备扫描到的scanRecord数组,识别是否有下面加粗斜体的02 15这两个数字.如果有,搜索到的蓝牙设备就是IBeacon. // AirLocate: // 02 01 1a 1a ff 4c 00 02 15 # Apple's fixed iBeacon advertising prefix // e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # iBeacon profile

  • iBeacon使用蓝牙连接范围精确到1-3米

    最近再写一个项目,需要自动签到.用的就是iBeacon,刚开始的时候比较懵比,不知道iBeacon是用来干啥的.因为iBeacon就是一个小盒盒,还是密封好的,就感觉自己懵了.然后上网查资料,才知道iBeacon就是一个小型的基站,手机打开蓝牙之后,如果你在这个基站的范围之内,会自动匹配上.你对iBeacon不需要做任何的操作,因为里面有电池,说是可以使用5年左右. 以上就是大概的情况,接下来介绍的是代码展示部分. 首先,在你的主清单中AndroidManifest.xml中添加权限: <use

  • 小程序获取周围IBeacon设备的方法

    本文实例为大家分享了小程序获取周围IBeacon设备的具体代码,供大家参考,具体内容如下 该功能实现需要使用以下API: wx.startBeaconDiscovery(OBJECT):开始搜索附近的iBeacon设备 wx.stopBeaconDiscovery(OBJECT):停止搜索附近的iBeacon设备 wx.onBeaconUpdate(CALLBACK):监听 iBeacon 设备的更新事件 wx.openBluetoothAdapter(OBJECT):监听蓝牙状态 wx.onB

  • 微信小程序iBeacon测距及稳定程序的实现解析

    前言 iBeacon是苹果公司推出的一项低耗能蓝牙技术,由蓝牙设备发射包含指定信息的信号,再由移动设备接收信号,从而实现近场通信.微信小程序2017年开始支持iBeacon,摇一摇附近就是基于iBeacon实现的,此外iBeacon还可以实现距离测量,本文将介绍如何基于微信小程序实现iBeacon测距. iBeacon测距原理 蓝牙信标发射的信号强度(rssi)与收发设备之间的距离,某种程度上呈正相关,因此通过合理的运算转化,可以通过rssi的值反推出与接收设备间的距离. 蓝牙信标的rssi值是

  • 微信小程序ibeacon三点定位详解

    空余时间简单写了一个微信小程序ibeacon三点定位. 事先淘宝买了七八个ibeacon小设备,放置在办公司角落.分别设置三个ibeacon的位置坐标点,根据每一个ibeacon到已经开启蓝牙的目标物距离,计算出目标物在当前区域内坐标位置.适用于区域内购物指示.当然,进入该区域事先要打开手机蓝牙. 下面代码: var app = getApp() Page({ data: { motto: 'Hello World', openBLE:'打开蓝牙设备', startBLEDiscovery:'初

  • android获取ibeacon列表的方法

    android获取ibeacon列表,供大家参考,具体内容如下 最近公司有需要做ibeacon需求. 因为涉及扫码的时间.特意写一个service实现获取列表 可以根据扫描时间扫描出ibeacon列表 包含 uuid,设备名称,单位(米),电量等. 请根据自己的项目进行改造代码. 核心代码如下: /** * * <ibeaon服务> * * @author fulushan * @date 创建时间:2018年4月5日 下午11:34:04 */ public class IbeaconSer

  • Android提高之BLE开发Android手机搜索iBeacon基站

    前面文章讲述了Android手机与BLE终端之间的通信,而最常见的BLE终端应该是苹果公司倡导的iBeacon基站.iBeacon技术基于BLE,它的特点是通过广播对外发送消息,手机不需要连上iBeacon基站也能获取它的信息,目前主要用来做室内定位和营销信息推送,在BLE发出的广播里带上带上特定的信息从而被识别为iBeacon.在iOS里面使用iBeacon要经过passbook注册iBeacon的UUID和对应的文字简介,而在Android上则无类似passbook这种系统级的后台蓝牙搜索服

  • 如何在IOS中使用IBeacon

    什么是iBeacon? iBeacon 是苹果公司2013年9月发布的移动设备用OS(iOS7)上配备的新功能.其工作方式是,配备有低功耗蓝牙(BLE)通信功能的设备使用BLE技术向周围发送自己特有的 ID,接收到该 ID 的应用软件会根据该 ID 采取一些行动. 从个人的角度看: iBeacon向四面八方不停地广播信号,就像是往平静的水面上扔了一块石子,泛起层层涟漪(俗称水波),波峰相当于 iBeacon 的RSSI(接受信号强度指示),越靠近中心点的地方波峰越高(RSSI 越大),这个波峰的

  • 如何在IOS中使用Cordova插件

    一.准备 插件功能:打开IOS相机 1:创建插件 plugman create --name [插件名称] --plugin_id [插件ID] --plugin_version [插件版本号] plugman create --name CameraDemo --plugin_id cordova-plugin-camerademo --plugin_version 1.0.0 2:添加IOS平台 plugman platform add --platform_name ios 3:创建pac

  • 如何在iOS中高效的加载图片详解

    目录 前言 图片的渲染流程 DataBuffer SD源码分析 ImageBuffer 占用内存大小 Xcode测试 如何减少图像占用内存 向下采样 SD源码分析解码过程 选择正确的图片渲染格式 渲染格式 如何正确的选择渲染格式 减少后备存储器的使用 减少或者不使用 draw(rect:) 方法 如何在列表中加载图片 线程爆炸 总结 前言 在iOS开发中,图片(UIImage)是我们在开发中,占用手机内存比较大的对象,如果在运行过程中,内存占用过大,对电池寿命会造成影响,如果超过了内存占用的最大

  • 如何在 iOS 应用中添加位置信息

    最近要在 iOS 应用中添加位置信息, 需要满足的需求如下: 应用在前台时能够获取位置信息: 通过切换. Home 按键将应用切换到后台时,停止获取位置信息: 应用程序在前台运行, 直接锁定屏幕时,能够继续获取位置信息: 接下来逐步实现这三个需求. 获取设备位置信息 在 iOS 上获取位置信息是很容易的, 网上的资料也很多, 我的代码如下: // make sure location service is enabled. if (!CLLocationManager.LocationServi

  • iOS中的NSURLCache数据缓存类用法解析

    在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在IOS设备中加一个缓存的机制.使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求.下面将介绍如何在IOS设备中进行缓存. 内存缓存我们可以使用sdk中的NSURLCache类.NSURLRequest需要一个缓存参数来说明它请求的url何如缓存数据的,我们先看下它的CachePolicy类型.    1.NSUR

  • iOS中sqlite数据库的原生用法

    在iOS中,也同样支持sqlite.目前有很多第三方库,封装了sqlite操作,比如swift语言写的SQLite.swift.苹果官网也为我们封装了一个框架:CoreData. 它们都离不开Sqlite数据库的支持. 本文主要介绍下,如何在swift中使用原生的sqlite的API. 在Xcode中引入sqlite API 新建一个swift项目后,我们需要让项目引入sqlite的动态链接库: 1.项目配置界面,选择Build Phases 2.点开Link Binary With Libra

  • iOS中使用对象的弱引用示例代码

    简介 我们都知道使用 UIImage imageNamed 创建的 UIImage 对象会被持有(强引用),如果图片太大会占用内存,损耗 APP 的性能,影响用户体验,如果能改造对其的强引用变为弱引用就可以解决问题. 我们可能会有类似上面的场景,有些对象暂时保存起来,可能后面会用到,也有可能不会使用,但是又不想去管理它们的生命周期,如果它们能够自己被销毁就很省事,不需要去关心这些对象到底耗费了多少内存. 今天跟大家聊聊如何在 iOS 开发中保持对对象的弱引用而不是强引用,希望看完之后,能帮助到大

  • 如何在IOS上使用ReplayKit与RTC

    在日益繁多的直播场景中,如果你也是某位游戏主播的粉丝的话,有一种直播方式是你一定不陌生的,那就是我们今天要聊的屏幕分享. 直播场景下的屏幕分享,不仅要将当前显示器所展示的画面分享给远端,也要将声音传输出去,包括应用的声音,以及主播的声音.鉴于这两点需求,我们可以简单分析出,进行一次屏幕分享的直播所需要的媒体流如下: 一条显示器画面的视频流 一条应用声音的音频流 一条主播声音的音频流 ReplayKit 是苹果提供的用于 iOS 系统进行屏幕录制的框架. 首先我们来看看苹果提供的用于屏幕录制的 R

  • 详解如何在Flutter中获取设备标识符

    目录 使用 platform_device_id 应用预览 代码 使用 device_info_plus 应用预览 代码 结论 本文将引导您完成 2 个示例,演示如何在 Flutter 中获取设备标识符 使用 platform_device_id 如果您只需要运行应用程序的设备的 id,最简单快捷的解决方案是使用platform_device_id包.它适用于 Android (AndroidId).iOS (IdentifierForVendor).Windows (BIOS UUID).ma

  • 如何在AngularJs中调用第三方插件库

    在AngularJs中我们会不可避免的使用第三方库,例如jquery插件库.我们不能散乱的在AngularJS中引入这些库,例如在controller中.那么应该怎么在Angular中使用第三方库呢? 如何使用? 很简单,给插件写一个directive. 在这里,我会使用一个简单的jquery插件Toolbar.js 的DEMO. 这是我们如何在jquery中创建一个tooltip的: <!-- Click this to see a toolbar --> <div id="

随机推荐