通过 iBeacon 监控和测距与 CoreBluetooth scanForPeripheralsWithServices 检测信标

2024-05-13

对于 iOS 对想要扫描 BLE 信标\外设的应用程序施加的限制,存在很多困惑。 在阅读了几个博客和 Stack Overflow 答案后,我想看看我是否正确理解了所有问题。如果有什么理解错误或者遗漏的地方请指正。我仅指 iOS 7 及更高版本,重点关注检测而不是连接(Can you connect to a CLBeacon using the iBeacon Monitoring & Ranging API?)。

信标的选项很明确 - 使用通用 BLE 外设或使用在iBeacon 格式 https://stackoverflow.com/questions/18906988/what-is-the-ibeacon-bluetooth-profile(此外,非标准外设可以在 adv 数据包中以 iBeacon 格式进行广告,并在扫描响应数据包中以不同的格式进行广告)。

一般限制

  • iBeacon 测距会让您知道您周围有哪些信标。您必须指定信标预先通告的 ProximityUUID(无“常规”扫描)。didRangeBeacons每秒都会使用最近发现的 CLBeacon 对象数组进行调用。距信标的距离及其精度是由 iOS 使用一些只有 Apple 开发人员真正知道的机密算法来计算的(该算法基于信标宣传的 rssi 值和 rssi-at-1-meter 校准字节)。您还可以使用 iBeacon 监控在每次进入或退出某个区域时调用代表 - 同样,您必须指定您要查找的 ProximityUUID(您也可以指定主要和次要)。 “退出区域”是指一段时间内未收到任何广告的时间,因此不能立即退出。可同时测距/监控的区域数量每台设备限制为 20 - 这意味着如果其他应用程序同时进行监视\测距,您的应用程序可能无法监视\测距(对吗?)。
  • CoreBluetooth - 您还可以检测信标广告中的其他广告结构。如果信标也以 iBeacon 格式进行广告,您将无法看到 iBeacon 字段(ProximityUUID、主要、次要...),尽管它们是在您在其他情况下可以看到的标准“制造商特定”广告结构下发送的。

在前台运行- 限制较少的用例:

  • iBeacon 测距和监控 - 没有进一步的限制。
  • CoreBluetooth - 传递nil in the serviceUUIDs of scanForPeripheralsWithServices将扫描所有外围设备。通过CBCentralManagerScanOptionAllowDuplicatesKey as YES在选项中将使didDiscoverPeripheral对于同一个外围设备\信标被多次调用(我假设使用计时器检测到一段时间内未收到广告并假设用户退出了“区域”)。

在后台运行- 更受限制的用例:

  • iBeacon 测距不能直接工作。 iBeacon监控会调用didEnterRegion并为应用程序提供 6 秒的运行时间 - 在此期间您可以开始测距(例如,检测主要和次要)。由于 iOS 会打开和关闭扫描以节省电池电量,因此检测可能不会立即进行。如果您输入具有相同 ProximityUUID 的多个信标的区域,并且您在没有特定主要和/或次要的情况下监视此 UUID,didEnterRegion当您开始接收来自第一个信标的信号时将被调用 - 但是,如果您没有退出第一个信标的区域并且您还进入了第二个信标的区域,则应用程序将不会再次被唤醒(didEnterRegion不会再次被调用),因此您无法开始测距以检测第二个信标的主要和次要。该应用程序不能简单地弹出到前台,但可以创建本地通知和其他后台操作。
  • CoreBluetooth - 根据核心蓝牙后台处理 https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html scanForPeripheralsWithServices可以在后台运行使用,但必须至少指定一个serviceUUID。didDiscoverPeripheral将给出 10 秒的运行时间。使用CBCentralManagerScanOptionAllowDuplicatesKey不管用 -didDiscoverPeripheral每个外设都会被调用一次。因此,您无法检测到该区域的“退出”和“重新进入”。我想您可以使用非标准 BLE 外设来更改其 MAC 地址来解决此问题。该应用程序不能简单地弹出到前台,但可以创建本地通知和其他后台操作。由于 iOS 会打开和关闭扫描以节省电池电量,因此检测可能不会立即进行。

应用程序被杀死后运行

  • iBeacon 监控 - 有效!即使用户终止了应用程序或设备重新启动。
  • CoreBluetooth - 如果应用程序被 iOS 终止(由于不活动或内存限制),应用程序将被唤醒。但是,如果用户明确终止该应用程序,它将不会被唤醒(这使得第一种情况难以测试)。我不知道设备重启后会发生什么...

有人对这些限制有更多经验吗?能scanForPeripheralsWithServices在某些用例中可以用作 iBeacon 监控的更好替代方案吗?

Thanks!


你的描述基本上是正确的。只需要澄清两点:

  • 20 个区域限制为not每个设备,它是特定于应用程序的。无论其他应用程序在移动设备上做什么,iOS 仍然允许您的应用程序监控最多 20 个区域。也就是说,可能存在特定于设备的硬件限制,即在硬件协助下可以在后台监控多少个区域。这些限制没有记录。如果超过这些未记录的限制,可能需要更长的时间才能在后台检测到信标。 (尽管如此,操作系统无法保证检测何时到来。)

  • 您无法连接到CLBeacon使用监控和测距 API。这些 API 仅适用于无连接的 BLE 广告数据包。

是的,可以使用scanForPeripheralsWithServices作为备选。这就是万向节信标为了实施专有系统所做的事情。然而,在背景检测时间和可靠性方面存在真正的缺点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 iBeacon 监控和测距与 CoreBluetooth scanForPeripheralsWithServices 检测信标 的相关文章

  • AVAudioRecorder 可以用来录制来自 iOS 应用程序的音频吗?

    我想录制即将到来的音频from我的 iPhone 应用程序 因此 在混合背景音乐和声音效果之后 我想在从设备的扬声器 或耳机 播放音频之前对音频进行采样 我一直在尝试RemoteIO 音频单元 http developer apple co
  • 如何通过 swift 包管理器在 swift 项目中添加 Alamofire [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在探索 SPM 现在我需要知道如何在我的项目中通过 SPM 导入 Alamofire 创建一个名为的 swift 文件Package在你
  • 应用程序图标上的快捷方式项目不适用于 iOS 13

    为了支持应用程序图标上的快捷方式项目 我们在中实现了以下方法SceneDelegate func windowScene windowScene UIWindowScene performActionFor shortcutItem UIA
  • 无效的 Swift 支持 - 文件位置不正确

    我一直在尝试将新版本上传到 iTunes Connect 来更新应用程序 我第一次使用 xCode 6 但收到了一封来自 Apple 的电子邮件 内容如下 亲爱的开发者 我们发现您最近交付的 应用程序 存在一个或多个问题 要处理您的交货 必
  • 在 HStack 中以正确的方式对齐两个 SwiftUI 文本视图

    我有一个包含两行的简单列表视图 每行包含两个文本视图 查看一和查看二 我想对齐每行中的最后一个标签 查看两个 以便名称标签领先对齐并保持对齐 无论字体大小如何 第一个标签 查看一个 也需要前导对齐 我尝试在第一个标签 查看一个 上设置最小框
  • SwiftUI 图像 ClipsToBounds

    尝试使用 SwiftUI Xcode 11 0 beta 2 我尝试用图像填充视图 Image large resizable aspectRatio contentMode fill frame width 80 height 80 al
  • HTML 5 + iOS - 创建混合应用程序

    我正在尝试将我的本机 iOS 应用程序转换为使用 HTML 5 的混合应用程序 经过研究后我最终得到了jQuery 移动 phoneGap 我的问题是 是否可以将 html 5 和本机 iOS 功能混合在一个单一的版本中 看法 例如我可以使
  • 使用静态库在 ios 项目中设置构建配置以在 xcode 4 中创建存档的正确方法是什么?

    我有一个依赖于多个静态库的工作应用程序 我已将其作为依赖项添加到应用程序中 并在构建阶段添加到与静态库位的链接中 一切都在模拟器和我连接的 iPad 上构建并运行良好 我想创建一个用于试飞的 ipa 文件 因此我按照试飞网站上的说明进行操作
  • Swift 3 中的 _ArrayType 去了哪里?

    我有一些用于中继的代码 ArrayType在 Swift 3 之前 我试图了解公共协议发生了什么 ArrayType 任何想法 ArrayType被重命名 ArrayProtocol 您可以在ArrayType swift https gi
  • 强制变量声明的协议 - Objective C

    是否可以在 protocol中声明变量 只是为了强制程序员在实现类 实现此协议的类 标头和实现中添加这些变量 Thanks 简短回答 不 不可能那样做 您最多可以强制方法和属性的可用性
  • 转发 UIAlertView 的可变参数

    我正在尝试设置一个非常简单的UIAlertView带有文本编辑 确定和取消按钮 我想根据文本编辑的内容禁用确定按钮 为了能够保留委托 以便他不会在警报视图之前消失 从而在用户对警报视图执行某些操作时立即导致崩溃 我对其进行了子类化 现在 我
  • App Store Connect 上传错误“您尚未获得云管理分发证书的访问权限”

    使用 Xcode 将 iOS 应用程序上传到 App Store Connect 自动管理签名 并收到此错误 查找和生成签名资产时发生以下错误 与苹果通讯失败 您尚未获得云管理分发证书的访问权限 请联系您团队的帐户持有人或管理员以授予您访问
  • 终止应用程序后发送本地通知 swift 2

    当应用程序状态进入终止 不运行状态时 可以在特定时间后执行某些特定任务 func applicationDidEnterBackground application UIApplication print APP in background
  • IOS 无法从 Google Drive 获取文件

    这是我的代码 GTLQueryDrive query GTLQueryDrive queryForFilesList query q NSString stringWithFormat IN parents root self driveS
  • iOS 版 Google 地图 SDK 中的热图

    有没有办法添加热图图层适用于 iOS 的 Google 地图 SDK https developers google com maps documentation ios 注意 我指的是存在于Javascript 版本的 Google 地图
  • iPad 3 renderInContext 缓慢 - 渲染性能不佳

    我试图从用户可以绘画的视图中获取图像 或添加一些其他视图 到目前为止 iPad1 和 2 一切正常 但在 iPad3 上它却像狗一样跑起来 我只是使用图层 renderInContext 方法 if UIScreen mainScreen
  • 无法更改 UITabBarItem.image:CSI 中不支持的像素格式

    我试图通过代码更改选项卡栏中显示的图像 我目前正在使用 Swift 和 Xcode 6 beta 3 我导入了 tabBarImage png 并 电子邮件受保护 cdn cgi l email protection在 Images xca
  • 管理 iOS 中的布局

    我是新来的iOS开发方面 我对 JAVA Swing 和 Windows 应用程序有扎实的背景 我想学习如何进行布局iOS 我猜iOS没有 布局管理器 就像 Java Swing 中的那样 发展的唯一出路UI是否指定每个控制器的尺寸和位置
  • 使用 Xcode 6 XLIFF 导出的 iOS 本地化/国际化设置 Bungle

    背景 Xcode 6 添加了快速导出功能 可为每种语言创建单个 XLIFF 文件 只需从文件导航器中选择您的项目 然后选择菜单项编辑器 导出以进行本地化 Issue 它工作得非常好 并且 XML 中包含了所有内容 除了设置捆绑字符串 有人有
  • 在 Mobile Safari 中点击

    敲击

随机推荐

  • 如何在 Angular2 中为表单分配和验证数组

    我的模型 this profile 在 javascript 中有一个属性叫做emails 这是一个数组 email isDefault status 然后我将其定义如下 this profileForm this formBuilder
  • 如何使用 Nokogiri 获取某些标签之后或之前的文本

    我有一个 HTML 文档 如下所示
  • 如何修复第三方 SDK 中重复的 libgnustl_shared.so 文件?

    当我使用 gradle 构建并运行 apk 时 出现以下错误 Error Execution failed for task app transformNative libsWithMergeJniLibsForDebug gt com a
  • 特殊名称属性还允许哪些其他巧妙的技巧?

    研究中一个问题 https stackoverflow com questions 13259162 vb net power operator overloading from c sharp关于实现 Visual Basic Power
  • Node.js 循环发送 http 请求

    我实际上遇到了使用 node js 执行的 javascript 代码的问题 我需要循环发送http请求到远程服务器 我在代码中设置了www google ca 这是我的代码 var http require http var option
  • php 删除特定文件夹及其所有内容

    我正在使用 php 删除包含已删除帖子图像的文件夹 我正在使用下面的代码 这是我在网上找到的并且做得很好 我想知道当一个文件夹中有其他文件夹时 如何只删除其中的特定文件夹 当我使用下面的代码时 如何才能做到这一点 使用 dev images
  • __doPostBack 方法如何被调用?调用方法在哪里?

    我用了一个
  • MediaStyle 通知未响应 RemoteControl 事件。

    我们正在将正在进行的播放通知迁移到 Lollipop 中引入的 MediaStyle 通知 RemoteControlClient 似乎已被弃用 并且 MediaStyle 通知不处理媒体按钮事件 例如通过耳机远程暂停 播放 有人得到这个工
  • 子查询与连接

    我重构了从另一家公司继承的应用程序的一个缓慢部分 以使用内部联接而不是子查询 例如 WHERE id IN SELECT id FROM 重构后的查询运行速度提高了约 100 倍 50 秒到 0 3 我预计会有改进 但谁能解释为什么它如此剧
  • 找到一系列间隔的最有效分组

    我有一个应用程序 其中有一系列不重叠的固定宽度间隔 每个间隔都有一个给定的键 每个间隔具有相同的宽度 并且可以存在连续的间隔 本质上 我想以最小化单独间隔的数量的方式对间隔和键进行分组 这可以通过合并具有相同键的连续间隔或查找匹配间隔并将它
  • IOS 8 CLLocationManager 问题(授权不起作用)

    import MyLocationViewController h define NSLog FORMAT printf s n NSString stringWithFormat FORMAT VA ARGS UTF8String int
  • Crystal Report 中多列的页面总计

    我有一个多列水晶报告 现在我想显示重量和金额列的运行总计 实际报告的图像是这样的 但是水晶报表设计器不显示其他列 所以我应该在哪一列上计算值 请遵循以下方法 使用以下文本创建名为 RunningTotal 的公式 RunningTotal
  • python 中的子进程调用以使用 JAVA_OPTS 调用 java jar 文件

    示例代码 import subprocess subprocess call java jar temp jar 如何在上面的命令中指定JAVA OPTS 当我使用上述命令时 我收到 java lang OutOfMemoryError 无
  • gcc 中 -g 选项的作用是什么

    我看到很多关于 gdb 的教程要求在编译 c 程序时使用 g 选项 我无法理解 g 选项的实际作用 它使编译器将调试信息添加到生成的二进制文件中 此信息允许调试器将代码中的指令与源代码文件和行号相关联 拥有调试符号可以使某些类型的调试 例如
  • 如何使用 Selenium webdriver 测试对 SVG 对象的点击?

    我正在尝试编写代码来检查单击 SVG 对象的功能 例如此 URL 上的美国州 http www amcharts com svg maps map usa 这可行 但是有更好的方法吗 不需要物理移动鼠标的东西 robert new Robo
  • React Router 总是将我重定向到不同的 url

    我是 React 和 React Router 的新手 我正在使用 React Router v4 并遵循基于以前版本的教程 但我让它工作了 使用在 SO 上找到的一些东西和 React Router v4 文档上的一些东西 但有一件事困扰
  • 无法提交到 svn - 访问被拒绝

    我正在使用 SVN 开发一个小项目 我查看了该项目 svn co http mylocalserver projectx 我进行了更改 更新并添加了文件 svn add file1 php file2 php 但是 每次我想使用此命令提交更
  • MySql JOINS 的优点/缺点

    当我从多个表中选择数据时 我经常使用 JOINS 最近我开始使用另一种方式 但我不确定从长远来看会产生什么影响 例子 SELECT FROM table 1 LEFT JOIN table 2 ON table 1 column table
  • PHP 版本如何匹配“API=yyyymmdd”签名/标签?

    是否有明确且可靠的来源来找出哪个 PHP 发行版本 x y z 携带 使用哪个 API yyyymmdd 签名 标签 PHP 的版本控制存储库是 PHP 版本与其 API 日期版本之间相关性的权威来源 请记住 仅主要版本PHP 的版本 例如
  • 通过 iBeacon 监控和测距与 CoreBluetooth scanForPeripheralsWithServices 检测信标

    对于 iOS 对想要扫描 BLE 信标 外设的应用程序施加的限制 存在很多困惑 在阅读了几个博客和 Stack Overflow 答案后 我想看看我是否正确理解了所有问题 如果有什么理解错误或者遗漏的地方请指正 我仅指 iOS 7 及更高版