【发布时间】:2020-08-30 07:22:00
【问题描述】:
我正在开发一个使用蓝牙与智能设备通信的应用。 它需要用这样的方案授权iPhone:
- 使用某些服务 UUID 过滤器扫描设备
- 连接到设备、发现服务、发现特征
- 调用读取操作检索公钥
- Exchange 收到公钥(使用 ECDH)
- 生成令牌
- 使用 writeValue 将加密令牌(使用 AES)写入设备
就是这样,之后我就有了稳定的连接并且能够与我的智能设备进行交互(将值写入受保护的属性)。
问题是,当我重新启动我的应用程序并执行上述所有步骤时,除了 Step_5(因为我之前生成并验证了我的令牌),Step_6 委托方法 didWriteValueFor: 甚至没有被调用,而是这个委托方法didDisconnectPeripheral 被Error Domain=CBErrorDomain Code=0 "Unknown error." UserInfo={NSLocalizedDescription=Unknown error.} 调用,我无法将值写入受保护的特征。
我无法理解我做错了什么。任何帮助都会很好。
UPD[0]:有时我可以在 Step_6 上收到didWriteValueFor: 的回调,但立即(例如不到 0.5 秒)iPhone 因上面的错误而断开连接。
UPD[1]:我也在关闭我的应用程序之前尝试cancelPeripheralConnection(),因为智能设备由于硬件原因无法处理多个连接,但这里没有运气。
UPD[2]:嗯,在搜索了三天的信息之后,我意识到我完全走错了方向。问题是我在 Xcode 中使用“停止”按钮中断了应用程序,并没有通过 iPhone 手动关闭它,因此,willTerminate 没有被调用,即使被调用,它的数量也非常有限是时候执行所有应该执行的进程了,结果连接没有中断(cancelPeripheralConnection方法没有被调用),下次启动App时,我尝试建立连接已连接到我的应用的设备。
至少它开始经常连接,但有时我仍然会收到此错误。主要问题是:如何正确断开与设备的连接?现在我取消订阅所有具有isNotify: true(设置为false)的属性并调用cancelPeripheralConnection。在断开连接之前我需要等待“取消订阅”过程吗?
UPD[3]:我是否等待退订完成都没关系。至少没有效果。
【问题讨论】: