[译]iOS 开发中使用 Swift 进行 iBeacons 交互指南

简介: 本文讲的是[译]iOS 开发中使用 Swift 进行 iBeacons 交互指南,我最近致力于研究一个关于 iBeacons 的 iOS 项目。本文中,我将全面的介绍如何使用 Swift 进行 iOS 项目中 iBeacons 开发。
本文讲的是[译]iOS 开发中使用 Swift 进行 iBeacons 交互指南,

#iOS 开发中使用 Swift 进行 iBeacons 交互指南

我最近致力于研究一个关于 iBeacons 的 iOS 项目。本文中,我将全面的介绍如何使用 Swift 进行 iOS 项目中 iBeacons 开发。我将介绍 iBeacons 是什么,如何进行使用以及在 iOS 项目中开发 iBeacons 交互你应该知道的编程模型。同时,我将分享一些在开发中学到的最佳实践方案。

##iBeacons 是什么

iBeacons 是一类使用 iBeacon 协议持续向周围发送自身标识信息的低功耗蓝牙设备。它们总是被放置在物理世界中(通常为室内)人们感兴趣的一些地方。当设备移动到一定范围内时,手机应用会收到推送并作出相应的响应。

你也许读过一些文章声称 iBeacons 是一种室内 GPS 信号不稳定时,取代 GPS 进行室内定位的解决方案。虽然这个的说法绝大部分是正确的,但是不能肯定的认为 iBeacons 是一个 GPS 完美的替代方案。他们在操作的模型和位置感知的准确性上比起传统的 GPS 有着相当大的区别。即便如此,带着一点创造性,你依然可以使用 iBeacons 做一些相当酷的事情。

iBeacon 的应用

在我们了解 iBeacons 如何工作之前,讨论一下它的使用方法也许有些必要。现在有多种多样的 iBeacons 应用,我喜欢把他们分成两大类:1. 推送感知场景的信息 2.定位追踪。

推送感知场景的信息

当用户移动到他们感兴趣的区域时,iBeacons 可以用来给他们推送信息。博物馆就是一个典型的例子,设想在每一个展品的位置放置一个 iBeacons 设备,当用户走近展品的时候,手机应用自动展示看到展品的更多信息会有多棒! 这就需要手机应用侦听发射器来了解有哪些发射器接近哪些展品,通过这样的匹配,发射器将定位用户在博物馆中的位置并让应用做出合理的响应。

定位追踪

作为推送感知场景的信息概念的扩展,你也可以使用 iBeacons 作为一种追踪用户的方式。设想在一个博物馆或者杂货店的建筑中遍布 iBeacons ,随着用户的移动,由他们通过发射器的顺序,你可以侦测出他们的移动轨迹。这允许你追踪用户的行踪,并且总结出最普遍的行进路线和行进模式。

当然,除了那些简单的例子外这里还有数之不尽的 iBeacons 应用-这个网站 很好地罗列出了这些项目。

iBeacon 寻址方案

如果你过去开发过低功耗蓝牙设备,你也许熟悉蓝牙广播包的概念。iBeacons 本质上只是一个发送广播包的低功耗蓝牙设备。当广播包广播出去,其广播包中包含三个值:一个 UUID、一个 主要值和一个次要值。这三个数字组合起来定义一个 iBeacon 设备的唯一标识并且它是可以由用户进行配置的。

将 UUID 连同主要值以及次要值组合起来是一个很好地寻址方案。设想如果像沃尔玛这样的零售商在所有的商店里配置 iBeacons 设备,他们或许选择一个唯一的 UUID 来指代沃尔玛并且沃尔玛中的所有 iBeacons 都会使用这个 UUID(这使得 UUID 变得不再特殊,但是好像这是 iBeacons 中很常见的寻址方式).之后他们可以使用 iBeacons 的主要值来指代商店的编号和次要值去区别商店所在的不同的部门或区域。

iBeacon 的制造商

iBeacons 的命名是因为苹果定义的 iBeacons 协议(比如广播出去的那些广播数据的形式),但是,他们并不是苹果生产或出售的。

而有几家公司是成产和销售 iBeacons 的,并且每一个生产商都有一点不同,比较主流的生产商包括 Estimote 、 Aruba 和Radius Networks .如果你正在打算使用 iBeacons ,上边的任何一家都会是个不错的选择。我个人曾使用过 Estimote 和 Radius Networks 两家公司的设备,所以我可以讲一下关于他们更多的细节。

下边是一些关于 Estimote 和 Radius Networks 两家生产商 iBeacons 的图片。

Estimote iBeacons

Radius Networks iBeacons.可拆卸式顶部能让你更简单地更换电池。

Radius Networks 的设备很好用因为你可以随意的打开和关闭并且可以方便地更换电池。 Estimote 的设备的电池使用寿命更久,但是当电量用完之后更换起来很麻烦,而且想关闭一个正在广播中的 Estimote 设备可不那么简单。

注:这还有几个和 iBeacons 相似的协议,比如 Eddystone,大部分的设备厂商生产的设备都是可以支持广播多种协议的。

###可配置性

当你购买了 iBeacons ,制造商通常会提供一个手机应用来帮助你对它进行相关的设置。你可以在应用中对 iBeacons 的 UUID 以及主要值和次要值进行设置,调整他们广播的速率和蓝牙广播的强度。一些设备上并不提供手机应用或者其他便捷的方式来配置他们生产的 iBeacons 。 如果没有什么特别的理由,我推荐你不要购买这些厂商的 iBeacons 。

下边是 Estimote 和 Radius Networks 两个厂商的 iBeacons 配置应用中的一些截图。

Estimote 应用配置截图

在 Estimote 厂商的应用中,你可以在截图中看到调整设备的广播比率和蓝牙广播强度的设置。

Radius Networks 应用配置截图

除了手机应用外,厂商之间的 iBeacons 还有如下的区别。当在选择 iBeacons 时,你应该去考虑如下的因素,因为厂商间趋向于在这些方便有所区别:

  • 设备的电池寿命

  • 设备的电池是否可更换

  • 信号的最大、最小范围

  • 设备是否有关闭的功能,至少是能否让他们停止广播

  • 对其他协议的是否支持(比如 Eddystone)

  • SDK 功能的完善性(如果一个存在你正打算使用的功能)

iOS 编程模型

我们已经讨论了 iBeacons 是什么,如何工作并且比较了不同厂商的区别。现在让我们来看下一下 iOS 编程中和他们进行交互的模板。

iBeacons 的所有功能都是有 iOS 中的 CoreLocation 库提供,由于 iBeacons 其实是蓝牙设备,这个封装其实非常有趣。开发者无需了解抽象的库内部本质上其实是蓝牙设备的信号发射器。

权限

在你的应用中使用 iBeacons ,用户必须允许访问位置权限。你可以通过在 Info.plist 文件中添加指定键值来提示用户准许权限。NSLocationWhenInUseUsageDescription 关键词将在应用处于前台时提示用户打开他们的位置权限。如果你的应用需要在处于后台时接收 iBeacons 位置的推送,需要使用 NSLocationAlwaysUsageDescription 关键词进行替代。

设置好这些键值之后,你还需要在应用唤起时,在你的 CLLocationManager 实例中调用 requestWhenInUseAuthorization() 方法或者 requestAlwaysAuthorization() 方法。

iBeacon 监听模式

接收 iBeacon 的通知有两种模型 :监听 和 范围,他们之间有着很大的区别。你应该依据项目的需求,使用其中的一个或者全部都进行使用。

监听

监听是两种模型中比较简单的一个,它可以在你的应用进入或者离开的一个区域的时候进行提醒。为了监听这些事件,需要实例化 CLLocationManager 类并且实现 didEnterRegion 和 didExitRegion 这两个代理方法。我的使用经验是退出事件可能会在你离开一个区域后推迟大概 30 秒后才会执行。但是进入一个区域的事件基本上在进入一个区域时马上就会触发,基本上是没有延迟的。如果你一开始是就是在一个区域中的,那么直到你离开这个区域之前不会收到任何的事件回调。

下边的是设置监听一个区域的代码。

Swift

var locationManager: CLLocationManager = CLLocationManager()
if let uuid = UUID(uuidString: "B9407F30-F5F8-466E-AFF9-25556B57FE6D") {
    let beaconRegion = CLBeaconRegion(
        proximityUUID: uuid,
        major: 100,
        minor: 50.
        identifier: "iBeacon")
    locationManager.startMonitoringForRegion(beaconRegion)
}

在设置了监听之后,你可以通过实现下边的两个代理方法来监听进入和离开区域的回调 :

Swift

func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
    if let beaconRegion = region as? CLBeaconRegion {
        print("DID ENTER REGION: uuid: \(beaconRegion.proximityUUID.UUIDString)")
    }
}
    
func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
    if let beaconRegion = region as? CLBeaconRegion {
        print("DID EXIT REGION: uuid: \(beaconRegion.proximityUUID.UUIDString)")
    }
}

这还有两个很有用的 CLLocationManagerDelegate 的代理方法 :didStartMonitoringForRegion 方法来确认监听被正常启动了,如果监听启动的时候出错 monitoringDidFailForRegion 方法会提供错误信息。

你需要注意到的一大限制因素是:你同时最多只能监听 20 个设备。如果你有超过 20 个设备,你就需要持续管理维护应用正在监听的设备列表。

范围

范围是 iBeacon 中的另一种推送模式,本质上它比起监听模式的信息量更大并且更频繁的发送更新数据到应用。设置范围模式和设置监听模式很相似,你只需要用 startRangingBeaconsInRegion 替换 startMonitoringForRegion 方法。一旦设置完成,你只需要监听 didRangeBeacons 方法的回调,这个代理方法实现如下:

Swift

func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
    for beacon in beacons {
        var beaconProximity: String;
        switch (beacon.proximity) {
        case CLProximity.Unknown:    beaconProximity = "Unknown";
        case CLProximity.Far:        beaconProximity = "Far";
        case CLProximity.Near:       beaconProximity = "Near";
        case CLProximity.Immediate:  beaconProximity = "Immediate";
        }
        print("BEACON RANGED: uuid: \(beacon.proximityUUID.UUIDString) major: \(beacon.major)  minor: \(beacon.minor) proximity: \(beaconProximity)")
    }
}

这些回调方法基本上每秒都会触发一次。每次回调返回一个CLBeacon 对象,其中范围内的设备信息如下:

  • 接近度 - CLProximity 类描述设备的接近程度,值包括 NearFarImmediate 和 Unknown

  • 精确度 - CLLocationAccuracy 类捕获一个和设备间精确到米精确值。

  • RSSI - 捕获一个 Int 类型的信息用来描述设备信号强度。

另外说明一下我们同是需要关注范围模式比起监听模式是更耗电。此外,尽管技术上你可以在后台使用范围模式,但这是个很不被认可的方案。网上的讨论中都说如果你在项目中这样使用会被苹果公司拒绝上线。

更多讨论

距离是否准确

网上有许多围绕每次 ranging event(指的就是范围模式的 didRangeBeacons 回调) 所返回的 CLLocationAccuracy 值的讨论。人们常把这个值当作手机与发射器的实际距离值。以我的经验来看,你当然可以把这个值当作实际的距离,但它并不总是那么准确。苹果文档建议你首先利用 CLProxity 枚举值来初步判定设备距离的远近,然后再用 CLLocationAccuracy 的值来区分其中接近度相近的值。

这篇博客 进行了一些有趣的试验来测试精确的距离。

监听超过 20 个设备

正像我前边介绍的那样,你现在只能监听 20 个 iBeacons ,如果你需要监听超过 20 个设备,你将需要在应用运行的过程中更改监听的设置,一种实现方案是用图表来展示你的 iBeacons 网络,在网络中定义最顶层的 iBeacons 以及如果这些彼此接近的情况下能够连接到的边界。这样你就可以快速的查找到最接近的 20 个 iBeacons 并监听他们。这需要很多的工作,但是定义一个这样的拓扑是一种实现 20 个 iBeacons 限制的方式。

法拉第容器(用于静电屏蔽)

如果你的 iBeacons 不能关闭或者不能轻易的在广播数据的过程中被停止,你也许应该考虑购买一个法拉第包或笼。如果 iBeacon 不能被关闭的话,多个设备配置起来很麻烦,会互相干扰,所以需要法拉第笼来屏蔽其他设备,一个个来设置。我们很确定 Estimote 的 iBeacons 就有上述的问题,放置所有的设备除了其中一个放置在法拉第笼中,这将使你很容易使你想要配置的 iBeacons 被孤立出来。






原文发布时间为:2017年2月16日

本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。
目录
相关文章
|
1月前
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
143 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
3月前
|
机器学习/深度学习 TensorFlow Swift
Swift语言适合多个领域的开发
Swift语言适合多个领域的开发
132 9
|
3月前
|
安全 编译器 Swift
Swift开发
Swift开发
108 9
|
3月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
5天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
27 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
2月前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
145 66
|
2月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
90 11
|
2月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
174 3
|
2月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
3月前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。

热门文章

最新文章

  • 1
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 2
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 3
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 6
    9.Swift学习之数组
  • 7
    快看Sample代码,速学Swift语言(2)-基础介绍
  • 8
    swift(MJRefresh框架)的使用
  • 9
    Swift游戏实战-跑酷熊猫 03 熊猫跑动动画
  • 10
    Swift---一门智能型的编程语言
  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    28
  • 2
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    29
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    40
  • 4
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    34
  • 5
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    27
  • 6
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    143
  • 7
    【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
    247
  • 8
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
    90
  • 9
    深入探索iOS开发中的SwiftUI框架
    145
  • 10
    ios样式开关按钮jQuery插件
    61