个人怎么制作网站,引用网站信息怎么做备注,怎么注册百度账号,服装店网站模板iBeacon 是苹果公司在 iOS 7 中新推出的一种近场定位技术#xff0c;可以感知一个附近的 iBeacon 信标的存在。 当一个 iBeacon 兼容设备进入/退出一个 iBeacon 信标标识的区域时#xff0c;iOS 和支持 iBeacon 的 app 就能得知这一信息#xff0c;从而对用户发出相应的通知… 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 可以运行一个比较短的时间。在这段时间内app 可以根据 beacon 的属性查询到用户的地理位置通过查询服务器或者本地数据例如在化妆品专柜之后就可以通过一个 local notification 推送化妆品的促销信息。用户可以点击这次 local notification 来查看更详细的信息这样一次促销行为就完成了。 API 闲话少说我们来看下 iBeacon 具体怎么使用 Beacon 的表示 iBeacon 本质上来说是一个位置区域信息所以 Apple 把 iBeacon 功能集成在了 Core Location 里面。 iBeacon 信标在 Core Location 中表现为一个 CLBeacon它圈定的范围则表现为 CLBeaconRegion这是一个 CLRegion 的子类。 CLBeaconRegion 主要用三个属性来标识一个 iBeaconproximityUUID、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 的距离。 Ranging 除了使用地理围栏 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 信息的时候 app 必须在前台运行。 行为 iBeacon 的 API 并不十分复杂但他的行为比较难弄清楚特别是当应用运行在后台时检测到 beacon 的时间延迟会让开发者难以推测。在做了一些实验和合理的推测后我们得出了一些结论 检测到 beacon 的时间跟设备进行蓝牙扫描的时间间隔有关每当设备进行扫描的时候就能发现 iBeacon region 的变化。在 ranging 打开的情况下设备会每秒钟做一次扫描也就是说状态更新最多延迟一秒。程序在后台运行并且 monitoring 打开的时候设备可能每隔数分钟做一次扫描。iOS 7 的响应速度较慢iOS 7.1 有比较大的改善。如果存在设置 notifyEntryStateOnDisplayYES 的 beaconiOS 会在屏幕点亮的时候锁屏状态下按下 home 键或者因为收到推送点亮等进行一次扫描。设备重启并不影响 iBeacon 后台检测的执行。iOS 7 中在多任务界面中杀掉程序会终止 iBeacon 检测的执行iOS 7.1 上改变了这一行为被杀掉的 app 还可以继续进行 iBeacon 检测。参考 AirLocate苹果官方的 sample code包含了 iBeacon 的大部分用法。HiBeacons另一个 demo。iBeacon Monitoring in the Background and Foreground实验证实了 iBeacon 的一些行为。