iOS CoreBluetooth低版本适配:CBConnectPeripheralOptionEnableAutoReconnect符号崩溃
问题解决:iOS 17以下版本因CoreBluetooth符号缺失崩溃
问题根源
你遇到的崩溃是因为CBConnectPeripheralOptionEnableAutoReconnect是iOS 17.0才新增的符号,虽然你用了#available做运行时版本判断,但dyld(动态链接器)会在App启动阶段就解析所有引用的符号,低版本系统里没有这个符号,直接导致启动崩溃,和代码是否执行到那部分无关。
解决方案
有两种可靠的解决方式:
方式1:直接使用常量对应的字符串字面量
CoreBluetooth的这些连接选项本质是字符串常量,你可以直接用字符串替代系统常量,避免引用低版本不存在的符号:
修改BluetoothConnectionManager中的connectionOptions实现:
private var connectionOptions: [String: Any] = { if #available(iOS 17.0, *) { [ CBConnectPeripheralOptionNotifyOnConnectionKey: true, "CBConnectPeripheralOptionEnableAutoReconnect": true, CBConnectPeripheralOptionEnableTransportBridgingKey: NSNumber(value: true) ] } else { [ CBConnectPeripheralOptionNotifyOnConnectionKey: true, CBConnectPeripheralOptionEnableTransportBridgingKey: true ] } }()
方式2:设置CoreBluetooth.framework为弱链接(Weak Linking)
如果不想用字符串字面量,可以修改项目设置,把CoreBluetooth框架设置为弱链接:
- 打开Xcode项目的Build Phases -> Link Binary With Libraries
- 找到CoreBluetooth.framework,将其状态从
Required改为Optional
弱链接的作用是:如果系统中不存在该框架或某个符号,dyld不会崩溃,而是将符号设为nil,此时#available的判断就能正常生效。
验证修改
修改后,在iOS 16.4或更低版本的模拟器/真机上启动App,dyld不会再因找不到符号崩溃,代码会正常进入else分支执行降级逻辑。
内容的提问来源于stack exchange,提问作者Koushik Mudi
相关产品推荐
相关产品推荐

