iOS 11蓝牙变化 - ShenYj/ShenYj.github.io GitHub Wiki

iOS 11蓝牙变化

17年4月份基础蓝牙开发,10月份发布iOS 11.0后就遇到了一个蓝牙的bug, 连接设备后, 大概5分钟左右会断开一次, 控制台报错信息

Error Domain = CBErrorDomain 
               Code = 6 "The connection has timed out unexpectedly." 
    UserInfo =  {
                    NSLocalizedDescription =The connection has timed out unexpectedly.
                }

测试设备:iPhone 6 设备系统:iOS 11.0.X (具体版本号不记得了)

于是就开始对比测试分析, 这是当时总结的记录,后来在苹果开发者论坛中也有人遇到了此BUG,苹果已经在iOS 11.1下修复了这个问题

iOS 11下

  • iOS 11 控制中心中的蓝牙开关功能变更 —> 断开本次蓝牙连接
  • iOS 11 控制中心中点击蓝牙开关断开连接后, 获取到的设备蓝牙状态 —> 关闭
  • iOS 11 控制中心中点击蓝牙开关断开连接后, 继续控制中心中打开开关能够重连
  • iOS 11 控制中心中点击蓝牙开关断开连接后, 设置中点击允许新的连接能够重连
  • iOS 11 控制中心中点击蓝牙开关断开连接后, 不会执行didDisconnectPeripheral回调方法
  • iOS 11 因为设备/距离断开连接后, 会执行didDisconnectPeripheral回调方法
  • iOS 11 设置中点击蓝牙开关断开连接后, 会执行didDisconnectPeripheral回调方法, 设置中开启后能够重连

iOS 8 ~ iOS 10 (以iOS 10为例)

  • iOS 10 控制中心中的蓝牙开关功能 —> 关闭蓝牙
  • iOS 10 控制中心中的蓝牙开关关闭蓝牙后, 获取到设备蓝牙状态 —> 关闭
  • iOS 10 控制中心中的蓝牙开关关闭蓝牙后, 继续控制中心中打开开关能够重连
  • iOS 10 控制中心中的蓝牙开关关闭蓝牙后, 设置中开启蓝牙能够重连
  • iOS 10 控制中心中的蓝牙开关关闭蓝牙后, 会执行didDisconnectPeripheral回调方法
  • iOS 10 因为设备/距离断开连接后, 会执行didDisconnectPeripheral回调方法
  • iOS 10 设置中点击蓝牙开关断开连接后, 会执行didDisconnectPeripheral回调方法, 设置中开启后能够重连

突然冒出来这么个大BUG, 我也是懵逼了, 难道最近一直忙着写其他需求, 忽略了? 最近改代码新增BUG? 还是一直存在没留意没发现?

当时身边没有其他测试手机,就想着用自己的手机先跑下 ,结果Xcode提示不支持该版本iOS系统, 然后我就想着是不是iOS系统自身的BUG,把测试机给升级到了iOS 11.1.1, 可升级完后, Xcode 9.0又不能支持这么高版本的iOS系统了. 检查Xcode更新又没有, 真是蛋疼啊.....

换了设备,依旧, 找了个Android机跑了下, 一切正常, 又找了个iOS 10的测试机跑来一切正常, 稍微淡定了一些, 看样子是新增问题, 等等看, 等收到Xcode更新后升级完跑在iOS 11.1.1上看看.于是先去查询下这方面资料

遇到这个问题的很少, 在Stack Overflow上搜到几个, 系统版本还是iOS 8.0+的,并不是近期的,简单看了下, 应该不是一回事. 在苹果技术论坛中发现了一例相同的BUG 链接, 等了很久都没有更新, 查询资料也没有什么进展, 不得不去苹果网站手动找Xcode更新, 更新后,跑在iOS 11.1.1上,目前一切正常, 希望这个BUG被苹果真正修复了, 否则这样严重的BUG对于蓝牙强实时的产品就是严重的冲击.

17年10月份做完OTA相关功能开发后, 就再没有研究过蓝牙方面的技术了,如果有机会,应该再看系统性的看一遍蓝牙协议栈。

⚠️ **GitHub.com Fallback** ⚠️