iphone bluetooth ibeaconios didenterrigonegion 激活后台 10秒 可以延长吗

iBeacon技术(7)
iBeacon 是苹果公司在 iOS 7 中新推出的一种近场定位技术,可以感知一个附近的 iBeacon 信标的存在。
当一个 iBeacon 兼容设备进入/退出一个 iBeacon 信标标识的区域时,iOS 和支持 iBeacon 的 app 就能得知这一信息,从而对用户发出相应的通知。
典型的应用场景例如博物馆实时推送附近展品的相关信息,商场内即时通知客户折扣信息等。在
Apple Store 中也部署了 iBeacon 来推送优惠、活动信息。
iBeacon 基于低功耗蓝牙技术(Bluetooth Low Energy, BLE)这一开放标准,因此也继承了 BLE 的一些特点。
相比于 NFC 的数厘米的识别范围,iBeacon 的识别范围可以达到数十米,并且能够估计距离的远近。
iBeacon 是基于 BLE 做的一个简单封装,因此大部分支持 BLE 的设备都可以兼容。
例如可以使用一个普通的芯片作为信标,使用
Android 设备检测信标的存在。
不少beacon 实现宣称可以不依赖外部能源独立运行两年。
我们以一个连锁商场的例子来讲解 iBeacon 的一个流程。在一个连锁商场中,店家需要在商场中的不同地方推送不同的优惠信息,比如服装和家居柜台推送的消息就很有可能不同。
当消费者走进某个商场时,会扫描到一个 beacon。这个 beacon 有三个标志符,proximityUUID 是一个整个公司(所有连锁商场)统一的值,可以用来这个公司,major
值用来标识特定的连锁商场,比如消费者正在走进的商场,minor 值标识了特定的一个位置的 beacon,例如定位到消费者正在门口。
这时商场的
会被系统唤醒,app 可以运行一个比较短的时间。在这段时间内,app 可以根据 beacon 的属性查询到用户的地理位置(通过查询服务器或者本地数据),例如在专柜,之后就可以通过一个
local notification 推送化妆品的促销信息。用户可以点击这次 local notification 来查看更详细的信息,这样一次促销行为就完成了。
闲话少说,我们来看下 iBeacon 具体怎么使用:
Beacon 的表示
iBeacon 本质上来说是一个位置(区域)信息,所以 Apple 把 iBeacon 功能集成在了 Core Location 里面。
iBeacon 信标在 Core Location 中表现为一个 CLBeacon,它圈定的范围则表现为 CLBeaconRegion,这是一个 CLRegion 的子类。
CLBeaconRegion 主要用三个属性来标识一个 iBeacon,proximityUUID、major 和 minor。
proximityUUID 是一个 NSUUID,用来公司,每个公司、组织使用的
iBeacon 应该拥有同样的 proximityUUID。
major 用来识别一组相关联的 beacon,例如在连锁超市的场景中,每个分店的 beacon 应该拥有同样的 major。
minor 则用来区分某个特定的 beacon。
这些属性如果不指定(即 nil),匹配的时候就会忽略这个属性。例如只指定 proximityUUID 的 CLBeaconRegion 可以匹配某公司的所有 beacons。
Monitoring
Apple 在 iOS 4 中增加了地理围栏 API,可以用来在设备进入/退出某个地理区域时获得通知,这些 API 包括 -startMonitoringForRegion:、-locationManager:didEnterRegion:、-locationManager:didExitRegion: 等。
CLBeaconRegion 作为 CLRegion 的子类也可以复用这些 API,这种检测 iBeacon 的方式叫做 monitoring。
使用这种方法可以在程序在后台运行时检测 iBeacon,但是只能同时检测 20 个 region,也不能推测设备与 beacon 的距离。
除了使用地理
API 的方式,Apple 还在 iOS 7 中新增加了 iBeacon 专用的检测方式,也就是 ranging。
通过 CLLocationManager 的 -startRangingBeaconsInRegion: 方法可以开始检测特定的 iBeacon。
beacon 的时候,CLLocationManager 的 delegate 方法 -locationManager:didRangeBeacons:inRegion: 会被调用,通知调用者现在被检测到的 beacons。
这个方法会返回一个 CLBeacon 的数组,根据 CLBeacon 的 proximity 属性就可以判断设备和 beacon 之间的距离。
proximity 属性有四个可能的值,unknown、immediate、near 和 far。
另外 CLBeacon 还有 accuracy 和 rssi 两个属性能提供更详细的距离数据。
使用 iOS 设备作为 iBeacon
我们可以使用 Core Bluetooth 框架来广播特定的 payload 来让 iOS 设备成为一个 iBeacon。
这个 payload 可以由 CLBeaconRegion 的 -peripheralDataWithMeasuredPower: 方法来获取。
之后交给 CBPeripheralManager 广播出去就可以了。
需要注意的是,广播 iBeacon 信息的时候
必须在前台运行。
iBeacon 的 API 并不十分复杂,但他的行为比较难弄清楚,特别是当应用运行在后台时,到
beacon 的时间延迟会让开发者难以推测。在做了一些实验和合理的推测后,我们得出了一些结论:
检测到 beacon 的时间跟设备进行扫描的时间间隔有关,每当设备进行扫描的时候,就能发现
iBeacon region 的变化。
在 ranging 打开的情况下,设备会每秒钟做一次扫描,也就是说状态更新最多延迟一秒。
程序在后台运行,并且 monitoring 打开的时候,设备可能每隔数分钟做一次扫描。iOS 7 的响应速度较慢,iOS 7.1 有比较大的改善。
如果存在设置 notifyEntryStateOnDisplay=YES 的 beacon,iOS 会在屏幕点亮的时候(锁屏状态下按下 home 键,或者因为收到推送点亮等)进行一次扫描。
设备重启并不影响 iBeacon 后台检测的执行。
iOS 7 中,在多任务界面中杀掉程序会终止 iBeacon
的执行,iOS
7.1 上改变了这一行为,被杀掉的
还可以继续进行 iBeacon 检测。
AirLocate,官方的
sample code,包含了 iBeacon 的大部分用法。
HiBeacons,另一个 demo。
iBeacon Monitoring in the Background and Foreground,实验证实了 iBeacon 的一些行为。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:33681次
排名:千里之外
原创:43篇
转载:75篇
(1)(3)(5)(3)(31)(16)(1)(9)(18)(1)(9)(6)(6)(2)(2)(1)(2)2043人阅读
学习笔记(4)
iBeacon介绍
iBeacon是苹果在2013年WWDC上推出一项基于蓝牙4.0(Bluetooth LE | BLE | Bluetooth Smart)的精准微定位技术,当你的手持设备靠近一个Beacon基站时,设备就能够感应到Beacon信号,范围可以从几毫米到50米。因为是一种定位技术,苹果将iBeacon相关的接口放到了 CoreLocation.framework 。
下面是该文档内关于iBeacon的翻译:
iBeacon技术提升用户的定位体验
iBeacon技术提供了一种方法来创建和监控Beacon基站:使用蓝牙低功耗无线技术发送特定识别信息。蓝牙低功耗Beacon基站发射相同的UUID形成一片Beacon基站区域,你的应用程序可以通过Core Location区域监控(region monitoring)获得监控支持。Beacon基站可以通过它发射的其他附加信息把具有相同UUID的基站区分开来。当一个Beacon基站在用户的设备范围内,apps也可以监视到距基站的相对距离。因此,可以使用由Beacon基站发射的信息,来增强某一特定位置用户的体验。例如,一个博物馆app可以监测到放置在博物馆重要展品附近的Beacon基站,当一个用户接近一个特定的展品,该app可以根据到Beacon基站的相对距离作为线索,以提供有关该展品而不是另一个展品的信息。
区域监测和iBeacon
Core Location framework提供了两种方法来检测用户进入和退出进入特定区域: 地理区域监控(iOS 4.0 and later and OS X v10.8 and later)&和Beacon基站区域监控(iOS 7.0 and later)。一个地理区域是指在地球表面由一个已知点和特定半径所构成的圆所限定的区域。与之对比,Beacon基站区域是由设备到蓝牙低能耗基站的距离定义的。Beacon基站本身仅仅是一种发射蓝牙低能耗效载荷的设备
– 你甚至可以把你的iOS设备通过Core&Bluetooth framework变成一个Beacon基站。Apps&可以使用区域监测去感知用户跨越地域界限或者进出一个Beacon基站范围。当一个Beacon基站在iOS设备范围内,apps&还可以监控到Beacon基站的相对距离。您可以使用这些功能来开发多种基于位置的创新apps。由于地域区域和Beacon基站区域不同,选择何种区域监控很可能会依赖于您的应用程序的使用情况。在iOS中,您的应用程序关联的区域的监控将一直存在,即使app没有运行。如果身处于区域边界而app没有运行,那么该应用程序会被重新启动到后台来处理事件。同样,如果某一事件发生时该应用程序暂停了,它将被唤醒并给出一个较短的时间(大约10秒)来处理该事件。有必要时,一个app可以通过UIApplication类里的beginBackgroundTaskWithExpirationHandler:
&方法来申请更多后台常驻时间。
Determining the Availability of Region Monitoring&
在尝试监测某一区域前,您的应用程序应该检查当前设备是否支持区域监测。这里有一些监测区域可能无法使用的原因:
该设备不具有支持区域监测的必要的硬件。
用户拒绝授权应用程序使用区域监控。
用户在设置里停用定位服务。
用户在设置里禁用后台程序刷新,无论是对设备或您的app。
设备处于飞行模式,不能打开必要的硬件。
iOS 7.0之后,当试图监视区域之前应该先调用CLLocationManager 类的isMonitoringAvailableForClass:和authorizationStatus方法。isMonitoringAvailableForClass:方法告诉你底层的硬件是否支持指定类的区域监测。如果该方法返回NO,则您的应用程序无法在设备上使用区域监测。如果返回YES,调用authorizationStatus方法来确定应用程序是否正在授权使用定位服务。如果授权状态为kCLAuthorizationStatusAuthorized,您的应用程序可以接收其注册的某区域的过境通知。如果授权状态为任何其他值,则应用程序不会收到这些通知。
注:&即使一个应用程序无权使用区域监测,它仍然可以注册区域以供以后使用。如果用户随后给应用程序授权,这些区域监测都将开始,并产生后续的过境通知。如果应用程序未被授权而你不想注册监测区域,可以使用locationManager:didChangeAuthorizationStatus:委托方法检测应用程序状态的变化和删除区域。
最后,如果你的应用程序需要在后台处理位置更新,一定要检查UIApplication类的backgroundRefreshStatus属性。您可以使用这个属性的值来确定是可以后台刷新的,如果不是则可以提醒用户。注意,当后台应用刷新设置为全局禁用或专门为你的应用程序禁用时,系统不会通过区域通知叫醒你的应用程序。
Monitoring Beacon Regions
Beacon区域监测是使用iOS设备的机载无线电检测来监测用户是否在发射着iBeacon信息的蓝牙低能耗设备的附近。同地理区域监测一样 ,当用户进入或退出一个Beacon区域时,您可以使用此功能来生成通知或提供其他相关信息。相比被固定的地理坐标,Beacon基站区域可以通过以下值被设备到蓝牙低能耗基站的接近度识别:
proximity UUID(全局惟一标识符),以一个128位的值唯一标识一个或多个Beacon基站为特定类型或特定的组织。
major,一个16位的无符号整数,可以将具有相同proximity&UUID的Beacon基站组织联系起来。
minor ,一个16位的无符号整数,区分proximity&UUID和major相同的Beacon基站。
由于一个Beacon区域可以放置多个Beacon基站,Beacon区域监测支持几个有趣的用例。例如,一个致力于在特定的百货商店提高客户体验的应用可以使用相同的proximity&UUID来监控所有连锁百货商店。当用户接近商店,app检测到商店的Beacon基站,并使用这些Beacon基站的major&和minor的值来确定附加信息,如用户到的是哪个门店或者顾客在门店的哪个区域。(注意,虽然每一个Beacon基站必须发射proximity &UUID,但major和minor的值是可选的。)
Defining a Beacon Region to Be Monitored&
要开始监测一个Beacon区域,首先得定义这个区域然后注册到系统里。你可以用CLBeaconRegion类的适当初始化方法定义一个Beacon区域。当你创建一个CLBeaconRegion对象,需要指定proximityUUID,major和minor的属性(proximityUUID是必需的,主要和次要的值是可选的)。您还必须提供一个字符串,用来唯一标识该Beacon区域,这样您就可以在代码中引用它。注意,Beacon区域的标识符与Beacon基站发射的识别信息无关。
调用CLLocationManager 对象的startMonitoringForRegion: 方法来注册一个Beacon区域。以下是代码:
- (void)registerBeaconRegionWithUUID:(NSUUID *)proximityUUID
andIdentifier:(NSString*)identifier {
// Create the beacon region to be monitored.
CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc]
initWithProximityUUID:proximityUUID
identifier:identifier];
// Register the beacon region with the location manager.
[self.locManager startMonitoringForRegion:beaconRegion];
同地理区域监控一样,对一个已经经过授权的app来说,beacon区域监控也会在注册后立即开始。当用户的设备检测到某个基站发射的识别信息(proximity UUID, major value, and minor value)&和注册的基站区域信息一样时,系统会为您的app生成适当的区域事件。
注:只使用一个UUID值来配置一个beacon区域是不可取的。这样做会使得当设备进入任何具有该UUID范围内时会被激活。在进入基站区域后,你又要开始扫描附近的beacon基站来获取有关beacon基站的详细信息。
Handling Boundary-Crossing Events for a Beacon Region&
当用户进入到注册的beacon基站区域,location manager 会调用locationManager:didEnterRegion:作为它的回调函数。类似的,当用户不再处于任何已注册过的beacon区域, &location manager 会调用locationManager:didExitRegion: 作为它的回调函数。注意,用户必须穿越区域的边缘才能触发这些回调。实际上,如果用户已经在区域范围内了,&location
manager 不会调用locationManager:didEnterRegion:方法。你可以通过实现这些委托方法来适当的提醒用户或者展现location-specific &&UI。你可以通过设定beacon区域的notifyOnEntry 和notifyOnExit属性(默认值是YES)来指定哪些穿过边境事件(越界事件)需要通知你的app。例如,如果你只想当用户离开某个区域范围的时候得到通知,你可以设定该区域的notifyOnEntry值为NO。你也可以推迟通知用户已经进入某区域直到用户点亮设备的屏幕。要这么做,只需要简单的在注册beacon区域时设置beacon区域的notifyEntryStateOnDisplay
值为YES并且设置notifyOnEntry值为NO。
Determining the Proximity of a Beacon Using Ranging&
当用户的设备进入某个注册过的beacon区域时,apps可以用CLLocationManager的startRangingBeaconsInRegion: 方法来确定该区域内的一个或多个beacon基站的相对距离,并且当距离发生变化时发出通知。(当试图扫描某区域的beacon基站时,请务必先调用isRangingAvailable 方法。)对很多app来说,到beacon基站的相对距离是相当有用的。例如,某博物馆在每个展位上放置了一个beacon基站,一个博物馆特定的app可以根据到展位的相对位置来提供相应的信息。location
manager 调用locationManager:didRangeBeacons:inRegion: 作为它的回调函数,无论是进入该区域,退出该区域,或者距离发生变化。该委托函数提供了一个元素为CLBeacon对象的数组,代表着当前beacon范围内扫描到的beacon基站。该数组按设备到基站的相对距离排序,最近的基站排列在前。你可以使用这些对象的信息去确定用户到各个基站的接近层度。CLBeacon对象的proximity属性给出了一般意义上到基站的相对距离。
注:beacon扫描取决于检测蓝牙低功耗的无线电信号的强度,并且这些信号的精度衰减(或减少)受墙壁,门窗,以及其他物理对象影响。该信号也受水的影响,代表人体本身也会影响这些信号。规划您的iBeacon部署时要注意这些因素是很重要的,因为他们会影响每个信标的proximity&值。如果需要的话,可以使用每个CLBeacon对象反馈的accuracy 和rssi 值来调整放置beacon基站的位置。
通过本节前面所述的博物馆app的例子,以下代码展示了如何使用一个beacon基站的proximity属性去确定用户的设备到基站的相对距离。该代码通过一个UI,提供了距离用户最近的相关特定博物馆展位的详细信息(由CLProximityNear常量定义)。
// Delegate method from the CLLocationManagerDelegate protocol.
- (void)locationManager:(CLLocationManager *)manager
didRangeBeacons:(NSArray *)beacons
inRegion:(CLBeaconRegion *)region {
if ([beacons count] & 0) {
CLBeacon *nearestExhibit = [beacons firstObject];
// Present the exhibit-specific UI only when
// the user is relatively close to the exhibit.
if (CLProximityNear == nearestExhibit.proximity) {
[self presentExhibitInfoWithMajorValue:nearestExhibit.major.integerValue]; }
[self dismissExhibitInfo];
为了使你的应用程序显示结果准确,请只当你的app在前台运行时使用基站扫描。例如设备在用户的手里并且设备与基站之间只有较少障碍物。当用户主动使用该设备并进入基站信号范围时,在前台运行也促进了更好的电池寿命管理。
注意:如果有多个基站设备发射相同的proximityUUID,major和minor,它们可能会由于具有不同的相近度和精度而调用locationManager:didRangeBeacons:inRegion:方法。建议是,每个基站装置配置唯一标识。此外,如果你扫描一台被配置为beacon基站的iOS设备,可能会在短时期内,locationManager:didRangeBeacons:inRegion:方法报告扫描到两个设备具有相同的proximityUUID,major和minor。这是因为iOS设备的蓝牙标识周期性变化暴露出来的隐私问题。基于原始蓝牙标识符的proximity&属性会在标示符变化后2秒内变为CLProximityUnknown。在10秒内,该标识符解决并且只反馈一个基站区域。
以上是关于监控和扫描beacon基站的翻译,接下来会翻译配置一个ios设备为ibeacon基站的相关内容。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6118次
排名:千里之外ibeacon - 简书
1.iOS 7.0及以后的版本开始支持iBeacon。2.硬件方面, iPhone4S 及以后, ipad 3代及以后, ipad Mini及以后, ipod 5及以后。3.iOS7.1与7.0的提升在于, ios 7.1在应用被kill掉后, 以及设备重启后, 仍然能继续监控iBeacon的边缘触发及点亮触发行为,而ios7.0在程序被kill掉后以及设备重启后不再进行监控4.通过iBeacon唤醒的应用,只会在后台运行10秒钟,当然也可以通过beginBackgoundTask来执行一些需要长时间执行的任务, 不管应用之前是处于后台, 还是被kill掉, 10秒内,应用的状态就是在后台运行。 10秒后, 理论上讲程序仍然是处于后台运行, 但这个时候也可能会因为系统资源的原因而直接把程序再次kill掉。5.ios7.1版本及以后,要进行后台及kill掉仍然可以监控,需要用户把蓝牙打开,后台应用应用程序刷新功能打开,以及定位服务中该应用的定位功能打开(不打开这个功能将不能进行iBeacon 的didRange方法的回调)6.didEnter和didExit的调用是以uuid为单位来触发的, 因为iBeacon可以有相同的uuid, 不同的major和不同的minor。 如果A,B是两个相同uuid, major和minor不同的两个iBeacon设备,用户从A区域走到B区域,不会引发didEnter和didExit事件。7.而且测试发现iBeacon的didEnter和didExit的调用并不准确。因为在同一秒内出现了先调didExit然后又调用了didEnter方法, 所以这两个方法存在不可靠性。8.好的方法应该是依赖于didRange来进行beacon的统计与代码调用, 因为系统只要唤醒后就会调用didRange。 在didRange中可以取当前系统的状态,以过滤掉应用在前台的情况。9.点亮屏幕唤起应用的行为需要在点亮的那个时刻,用户周围能检测到ibeacon设备, 否则不会触发唤醒应用的操作。10.进入区域来唤醒应用,则说明周围一定有iBeacon设备, 退出区域来唤醒应用,唤醒时周围可以没有iBeacon设备。进入区域和退出区域事件均能唤醒应用。11.ibeacon的边缘触发可以是ios设备在移动,也可以是ibeacon设备在移动。12.直接在ios程序中使用蓝牙功能进行ibeacon设备的扫描, 如果此时蓝牙处于关闭状态, 则会弹出提示, 提示用户:"打开蓝牙来允许“XXX应用“连接到配件"提示, 相信不少用户看到这个提示都会比较担心这是一个什么样的应用。 所以最好的办法是, 在程序中使用ibeacon, 如果ibeacon能使用, 则蓝牙功能必然处于打开状态,如果ibeacon不能使用, 先判断后台刷新是否打开, 以及用户是否授权, 如果没有问题, 则有可能是因为蓝牙没有打开。 但是不能确定一定就是蓝牙没打开。13.测试ibeacon离开的区域只需约15米即可, 最好是有障碍物, 不能直接让手机与ibeacon相互可见即可。14.如果不需要把当前ios设备模拟成iBeacon设备,是不需要打开Target的background mode并进行设置的。(网上好些文章什么都没有解释,直接告诉要打开这个,然后再设置bluetooth啥的,以及location update等。打开这个会导致程序在按下Home键后,进入后台会继续运行好长一段时间,测试发现最长可以运行25分钟左右。这样的应用,苹果如果审得较严的情况下,比较难以通过审核。)
UIAppDelegate
import UIKit
import CoreLocation
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate ,CLLocationManagerDelegate{
let manager = CLLocationManager()
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -& Bool {
window = UIWindow(frame: UIScreen.mainScreen().bounds)
window?.backgroundColor = UIColor.whiteColor()
let na = UINavigationController(rootViewController: ViewController())
window?.rootViewController = na
manager.delegate = self
return true
//进入监控
func locationManager(manager: CLLocationManager, didEnterRegion region: CLRegion) {
if region.isKindOfClass(CLBeaconRegion) {
let no = UILocalNotification()
no.alertBody = "欢迎光临"
no.soundName = UILocalNotificationDefaultSoundName
UIApplication.sharedApplication().scheduleLocalNotification(no)
//离开监控
func locationManager(manager: CLLocationManager, didExitRegion region: CLRegion) {
if region.isKindOfClass(CLBeaconRegion) {
= UILocalNotification()
no.alertBody = "欢迎再来"
no.soundName = UILocalNotificationDefaultSoundName
UIApplication.sharedApplication().scheduleLocalNotification(no)
ViewController
import UIKit
import CoreLocation
class ViewController: UIViewController {
var beaconRegion :CLBeaconRegion?
let manager = CLLocationManager()
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(label)
/**设置代理
manager.delegate = self
//Always会提示用户授权访问位置服务 —— 当然如果他们已经授权,系统的提示就不会出现。Always(始终) 和 When in Use(使用应用程序期间) 是 iOS 8 中位置服务权限的新形式。如果用户给应用程序授权了 Always(始终) ,那无论是前台还是后台运行,应用程序都调用任何可用的位置服务。
manager.requestAlwaysAuthorization()
title = "么么哒"
//MARK:懒加载
private lazy var label: UILabel = {
let label = UILabel(frame: CGRect(x: 60, y: 150, width: 200, height: 100))
label.backgroundColor = UIColor.cyanColor()
label.numberOfLines = 0
return label
extension ViewController: CLLocationManagerDelegate{
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
if status == CLAuthorizationStatus.AuthorizedAlways {
startMonitoring()
//开始监控
func startMonitoring(){
beaconRegion = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: "")!, major: 1, minor: 1, identifier: "code")
manager.startMonitoringForRegion(beaconRegion!)
manager.startRangingBeaconsInRegion(beaconRegion!)
NSUserDefaults.standardUserDefaults().setObject(1, forKey: "beaconAwakening")
//位置管理器失败
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
// 监控失败
func locationManager(manager: CLLocationManager, monitoringDidFailForRegion region: CLRegion?, withError error: NSError) {
//监控范围内的beacon
通过iBeacon唤醒的应用,只会在后台运行10秒钟,当然也可以通过beginBackgoundTask来执行一些需要长时间执行的任务,不管应用之前是处于后台, 还是被kill掉, 10秒内,应用的状态就是在后台运行。
10秒后, 理论上讲程序仍然是处于后台运行, 但这个时候也可能会因为系统资源的原因而直接把程序再次kill掉。
func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
// 在这里可以获取当前系统的状态,以过滤掉应用在前台的情况,ibeacon唤醒手机,手机也是处于后台状态
//为了保持后台长时间运行,开始后台任务,but,可能会被苹果拒绝
myTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({
//后台任务到期执行
// 关闭后台任务
UIApplication.sharedApplication().endBackgroundTask(myTask!)
myTask = UIBackgroundTaskInvalid
beacon in beacons {
WLLog("\(beacon)")
for beacon in beacons {
label.text = "proximity:\(nameForProximity(beacon.proximity))RSSI:\(beacon.rssi) 距离:\(beacon.accuracy)"
func nameForProximity(proximity: CLProximity) -&String{
switch proximity {
case CLProximity.Unknown:
return "Unknown"
case CLProximity.Far:
return "Far"
case CLProximity.Near:
return "Near"
case CLProximity.Immediate:
return "Immediate"
Info.plist
打开 Info.plist 并点击Information Property List 这一行上的 + 来添加一项
Key: NSLocationAlwaysUsageDescription
Type: String
Value:"SLC需要获取你的位置信息用于开门"

我要回帖

更多关于 ibeacon region 的文章

 

随机推荐