通过 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 检测信标 的相关文章

  • 从后台唤醒时应用程序会重新启动

    iOS 大师您好 我已经广泛搜索了答案 但找不到答案 我打赌对我的问题的第一个答复将是另一个类似的问题 但我找不到它 不管怎样 我的问题是我正在运行一个简单的地图应用程序 用户可以在地图上放置图钉 并在放置的图钉周围有一个自定义的圆圈覆盖
  • 如何改进 iOS 中的 TWTweetComposeViewController 代码?

    我已经实现了以下代码来进行 Twitter 共享 在我的代码中 我尝试测试 iOS 5 如果这不起作用 我会回到使用 ShareKit 的 Twitter 代码进行共享的旧方式 我向同事展示了代码 他建议我的代码可能有缺陷 我需要做两件事
  • iPhone - 创建图像网格列表

    我正在开发一个应用程序 它从网站获取图像并使用网格视图向用户显示 例如Apple的照片应用程序 当您点击图像时 我会推送一个显示图像信息和其他内容的视图控制器 实现这个的更好方法是什么 我想到了自定义 UITableViewCell 我见过
  • 如何修复C风格的for语句?

    什么是正确的修复方法C 风格的 for 语句对于下面发布的代码 目前我正在交战 C 风格的 for 语句已弃用 并将在将来删除 斯威夫特的版本 var ifaddr UnsafeMutablePointer
  • prepareForSegue 和代表

    我有一个有两个 segue 的应用程序 在其中一个 Segue 中 当前视图控制器成为委托 而另一个则不是 void prepareForSegue UIStoryboardSegue segue sender id sender if s
  • iOS 上每个选项的带有图像的操作表

    有没有办法在 iOS 上将图像添加到操作表中 与苹果在应用程序商店或苹果音乐应用程序上所做的一样 我对苹果文档的基本搜索表明我没有在操作表中子类化或添加子视图 UIActionSheet 并非设计为子类化 也不应向其层次结构添加视图 苹果文
  • 为什么我们在 @synchronized 块中传递 self ?

    我猜 synchronized 块不依赖于对象 而是依赖于线程 对吗 既然如此 我们为什么要传递 self 呢 synchronized是语言提供的用于创建同步作用域的构造 因为使用简单的全局共享互斥锁效率非常低 因此序列化每个单独的互斥锁
  • 应用程序图标未刷新

    我更改了新版本应用程序中的图标图像 并且我在设备中安装了旧版本应用程序 然后我安装了新版本 它在 iOS 5 中运行良好 但在 iOS 6 中 图标没有刷新 它仍然显示旧版本图标 徽标 如果没有安装旧版本应用程序 该设备在 iOS 5 和
  • 自动调整大小完成后如何获取帧大小

    我想知道 如何以及何时 viewDidLoad viewWillAppear viewDidAppear 可以获得自动调整大小以适合其父视图的 UIViews 框架大小 从你的问题中不清楚你为什么想要它 但我想这是为了布局你的子视图 幸运的
  • 如何向 JSQMessagesViewController 单元添加自定义视图,使其包含一个带有一些按钮和文本视图的视图?

    我在用https github com jessesquires JSQMessagesViewController issues 1820 https github com jessesquires JSQMessagesViewCont
  • iOS 4.2.1 丢失文件?

    这是我第一次使用最新的 xcode 3 2 5 和新的 iOS 4 2 1 当我在设备上运行应用程序时 我收到以下运行时错误 无法读取 Developer Platforms iPhoneOS platform DeviceSupport
  • 使用 UIActionSheet 更改视图时工具栏项目消失

    当从 a 启动视图时UIActionSheet按钮 通过导航栏后退按钮返回视图后 工具栏虽然仍然可见 但上面没有任何以前的按钮 自从更新到 iOS 6 以来 这个错误就出现了 并且是在模拟器和仅运行 iOS 6 的设备上测试时发生的 如果我
  • 使用隐藏的 SFSafariViewController 获取 Safari cookie

    我正在阅读以下关于从移动网页到本机 iOS 9 应用程序对用户进行身份验证的文章 并且想知道如何最好地实现类似于下面讨论的隐藏控制器的隐藏 safari 视图控制器 https library launchkit io how ios 9
  • 对 UIImage 进行方形裁剪,导致图像拉伸

    当尝试执行 UIImage 的中心裁剪时 我得到以下结果 左侧是原始图像640 1136 右边是适合正方形的裁剪图像UIImageView at 320 320 turns to 我对比率元素进行了相当多的修改 以便它可以正确检测要修剪的量
  • 如何使用自签名证书为 TLS 创建 iOS NWConnection?

    我正在尝试将 Apple 的新 NWConnection 类用于我的 MQTT 客户端 为了进行测试 我需要能够创建到本地测试代理的 TLS 连接 该代理具有自签名证书 到目前为止 我只是使用以下命令设置连接 self connection
  • 如果 NSExtensionActivationRule 设置为仅音频,则共享扩展不会出现在有功能的应用程序中

    我正在尝试创建一个共享扩展 用户可以从任何有能力的应用程序上传她的录音 该文档甚至有一个简单的示例 请参阅声明共享或操作扩展支持的数据类型 https developer apple com library content document
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的
  • 应用未能及时恢复

    我在一个非常具体的场景中遇到 未能及时恢复 崩溃 我认为与看门狗相关 仅在从后台恢复时 并且仅在进入后台后在很短的时间内执行此操作 a最多几秒钟 这似乎是相关的崩溃日志 Incident Identifier E30F2238 5B15 4
  • iOS 发送 iMessage 尽可能简单

    我希望能够以编程方式发送 iMessage 除了调用一个将文本发送到带有消息的号码的函数之外 无需执行任何其他操作 这两个消息都是文本框 我真的很感激一些示例代码 因为我在网上搜索过 但我发现没有任何帮助 这不适用于商业应用程序 仅适用于我
  • iOS 对 Google 云消息传递的支持

    我在谷歌的开发者控制台中看到 GCM 允许为 iOS 生成 API 密钥 我在网上搜索了有关如何在 iOS 应用程序中通过 GCM 实现推送通知的任何类型的文档 但没有找到答案 真的有可能在 iOS 应用程序中使用 GCM 实现推送通知 j

随机推荐

  • 如何在 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 及更高版