iOS 在从外设传入 BLE 连接时停止唤醒应用程序

2024-02-18

我们有一个 BLE 外设,每小时连接到手机并传递一些数据。该过程的工作原理如下:

使用密钥启动后UIApplicationLaunchOptionsBluetoothCentralsKey in

  1. application(didFinishLaunchingWithOptions launchOptions)应用程序使用传递给它的 ID 重新初始化 CBCentralManager。
  2. 然后它会执行常规恢复周期并从 BLE 外设读取数据。
  3. 向云中的服务执行 REST 请求。

假设应用程序在手机重启后至少启动一次,几天内一切正常(如果应用程序没有运行或被迫内存不足,iOS 会正确地再次启动它,假设用户没有手动强制关闭)。

然而,每隔几天,当有来自 BLE 设备的传入请求时,iOS 就会停止唤醒应用程序。如果用户重新启动应用程序,一切都会正常运行几天,然后再次停止。鉴于我们产品的性质,让我们的应用程序/外围设备以最可靠的方式协同工作至关重要。

关于为什么会发生这种情况的理论:
(经过仔细检查,他们都被解雇了)

  • 用户重新启动手机并忘记重新启动应用程序。
    我们添加了正常运行时间的记录,它显示手机在应用程序启动之间没有重新启动。

  • 内存警告导致应用程序被启动。
    再次添加日志记录,他们表明没有applicationDidReceiveMemoryWarning

  • 连接不良会导致应用程序在上传结果时运行时间超过 10 秒,iOS 会终止它并感到不安
    我们人为地将服务器响应延迟了 15 秒来测试这一点,并且在测试过程中一切都继续正常工作。

关于正在发生的事情以及为什么 iOS 停止通知应用程序有关传入 BLE 连接的任何想法?

问题之一是我们无法弄清楚如何可靠地重现该问题,因此任何建议也将不胜感激!

谢谢你!


更新1:这是我们初始化的方式CBCentralManager:

self.centralManager = CBCentralManager(delegate: self, queue: nil, options: [
    CBCentralManagerOptionRestoreIdentifierKey : MyCentralManagerID,
    CBCentralManagerOptionShowPowerAlertKey : 0])

我看到一些建议,队列参数不应为零。鉴于我无法可靠地重现问题,我会犹豫是否要进行更改,直到我可以自信地观察其效果。


首先我想说的是,我已经使用 CoreBluetooth 很长时间了,据我所知,CoreBluetooth 状态保存和恢复根本无法可靠地工作。你可以让它“正常”工作,但你永远不会让它可靠地重新连接,除非有一天苹果修复它。

有很多错误会导致它无法正常工作,但我会给你一个我认为导致你的问题的错误:

如果事件源自您正在通信的外围配件,例如连接/断开事件和特征通知,则状态恢复只会由于蓝牙相关活动而重新启动您的应用程序。对于其他事件,最重要的是一般蓝牙状态更改事件,您的应用程序将不会重新启动并收到通知。之所以如此糟糕,是因为所有蓝牙状态更改事件都会取消所有挂起或当前的连接,这意味着挂起的连接将被删除,并且您的应用程序不会收到通知。这实际上意味着您的应用程序仍然认为连接仍处于待处理状态,而实际上并非如此。由于您的应用程序此时已终止,因此再次唤醒它的唯一方法是让用户再次手动启动它(或者为此目的“破解”其他后台模式,这也不是很可靠)。

如果用户切换飞行模式、切换蓝牙、重新启动 iOS 设备或任何其他导致状态更改的未定义原因,就会发生这种情况......

但这只是一个错误。还存在许多其他情况,例如 XPC 连接在不同时间无明显原因中断。我还注意到,挂起的连接可能会进入“limbo”模式,其中外设状态设置为“正在连接”,但实际上,除非您循环连接状态,否则它永远不会连接。

无论如何,我很遗憾地说,但如果您正在开发一个必须依赖于在后台重新连接外围设备的应用程序,那么我不建议这样做。你会感到沮丧。我可能可以写一篇关于苹果不想修复的核心蓝牙中所有错误的文章。更奇怪的是,您可以很容易地通过一个应用程序破坏设备上的全局蓝牙连接,这样在设备重新启动之前没有应用程序可以使用蓝牙。这是非常糟糕的,因为它违背了苹果自己的沙盒原则。

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

iOS 在从外设传入 BLE 连接时停止唤醒应用程序 的相关文章

  • cordova-plugin-whitelist 适用于 Android,但不适用于 iOS (Phonegap Build)

    我正在开发一个用 Cordova 封装并使用 Phonegap Build 构建的 JavaScript 应用程序 我们包括cordova plugin whitelist来自我们构建中的 npm 并添加了
  • 适用于 iOS 的 Google Cast SDK 2.3.0 不支持 64 位

    似乎是适用于 iOS 的 Google Cast SDK 2 3 0 版本 https developers google com cast downloads GoogleCastFramework 2 3 0 Release zip停止
  • 使用 Objective-C 在 iPhone 应用程序中显示或隐藏 UIButton

    我在用UITextView编辑文本 我想用两个UIButtons编辑并保存 最初我想显示编辑UIButton 当用户单击编辑时我想显示保存UIButton 当内容成功保存后 我不想再显示保存按钮 我是一名 C 编码员 在 C 中我曾经这样做
  • 如何在 RestKit 中为同一类提供两条发布路线

    由于我无法弄清楚如何为同一个类设置两个不同的 POST 资源路径 因此我尝试手动创建 RKObjectLoader 请求 但它似乎不断发送 GET 请求而不是 POST 即使我已将方法设置为邮政 这是我的代码 User user User
  • iOS App布局错误,调用状态栏

    在主动通话和应用程序布局期间面临状态栏问题 我正在使用自动布局 当我运行应用程序 然后开始通话时 一切正常 UI 会随着状态栏的更改而正确缩放 但是 如果我首先开始通话 然后运行应用程序 应用程序屏幕会移动到底部 20pt 就像它们对新状态
  • 自动布局和ios5

    我正在使用故事板 我已经使用了自动布局 但它不适用于 ios5 并且会崩溃 所以我想删除它 但是 如何取消选中自动布局 但如果我取消选中自动布局 我如何为 iPhone 4 和 5 设置屏幕 Regards 您可以在 IB 中禁用自动布局
  • 在 Interface Builder 中的资产目录上使用图像

    是否可以直接在界面生成器上使用添加到资产目录中的图像 这是怎么做到的 在 UIImageView 属性上 我看不到任何引用资产目录上任何图像的选项 Import the images into the xcassets folder 单击右
  • UIBezierPath 的起始和结束角度?

    我在 iOS 中使用如下代码编写了半圆UI贝塞尔路径 and CAShape层 clockWiseLayer CAShapeLayer alloc init CGFloat startAngle M PI 2 CGFloat endAngl
  • iOS 内存警告

    我正在尝试使用从 Parse 数据库下载的图像填充集合视图 但我收到内存警告 然后偶尔崩溃 有谁知道其他应用程序如何设法呈现这么多图像而不崩溃 有人可以告诉我如何优化我已有的东西吗 这是所有相关代码 https gist github co
  • 切换到工作区并在 Xcode 中添加 CocoaPods 后提交 git 吗?

    我刚刚在 Xcode 5 中将 CocoaPods 添加到我当前的项目中 当然 CocoaPods 创建了一个工作区 并且我已在 Xcode 中启动了该工作区 我在工作区中看到了我的项目和 Pods 项目 我的项目从第一天起就处于源代码控制
  • 从 RemoteIO 保存音频的示例?

    我进行了搜索 但没有找到任何从 RemoteIO 音频单元保存音频的好示例或教程 我的设置 使用 MusicPlayer API 我有几个 AUSamplers gt MixerUnit gt RemoteIO 音频播放效果很好 我想添加将
  • 如何将十六进制数组转换为 UIImage?

    有几个与使用 P25mi 动态打印图像相关的未解答问题 没有一个得到公认的答案 下面有几个链接 如何将图像转换为位图代码以便在 iPhone 中进行蓝牙打印 https stackoverflow com questions 1383828
  • iPad 3 中配备 Xcode 4.2 和 Retina 的 iOS 5.1

    我有一台装有 Mac OS X Snow Leopard 的 Mac 我可以添加 iOS 5 1 吗 使用 iPad 3 的新分辨率 我们将如何处理图像 因为如果该应用程序将在 iPhone 3GS 4 和 iPad 3 中运行 我认为我们
  • 在WKWebview中设置useragent

    如何在 WKWebView 中设置自定义用户代理字符串 我正在尝试嵌入我的应用程序的版本 以便我的服务器端可以看到可用的功能 我找到了以下方法 let userAgent MyApp 1 33 7 request setValue user
  • 通过 iPhone 连接到 AT&T 无线网络的谷歌静态地图无法工作 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 最近 当我的 iPhone 连接到 AT T 无线网络时 我在检索静态地图时遇到了问题 但是 当我连接到本地 WiFi 时工作正常 上周日停止工作了几
  • 使用 hcitool 扫描低功耗蓝牙?

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

    基本上 我有一个 46 个字符的 NSString 我将其转换为 NSData 我需要将字符串填充到 48 个字符 仅在 NSString 末尾添加 是行不通的 所以 我只是使用以下方法增加了 NSData 的长度 NSString str
  • 如何使导航栏透明并淡出,就像 iPhone 中的照片应用程序一样

    我是 iPhone 编程新手 有人可以帮我吗 我想在iPhone中开发一个类似照片应用程序的应用程序 如何使导航栏和工具栏透明并淡出 就像 iPhone 中的照片应用程序一样 感谢你 UINavigationBar继承自UIView 所以你
  • 如何自动为 Swift 类创建初始化程序?

    UPDATE 使用结构而不是类 struct 在很多方面都更好 它有自己的初始化器 这是我的模型课 是否有可能创建init自动方法 每次我都必须将所有变量一一初始化 这会花费很多时间 class Profile var id String
  • 如何使用 afnetworking 在后台上传任务

    我正在尝试使用 AFNetworking 上传大文件 并在应用程序处于后台时继续上传 我可以很好地上传文件 但是当我尝试使用后台配置时 应用程序崩溃并显示以下堆栈跟踪 异常 EXC BAD ACCESS 代码 1 地址 0x8000001f

随机推荐