所以我试图在终止应用程序时断开与蓝牙设备的连接。我尝试过使用 AppDelegate 函数,甚至使用 willTerminate 消息的 onReceive 方法订阅 NotificiationCeneter,在这两种情况下,它们都会触发,我可以看到它们至少被调用,这就是我拥有设备的地方。 cancelPeripheral... 函数以及函数中的任何内容都试图触发。然而,当我进入“设置”时,我看到我的设备仍然处于连接状态。
MyView()
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willTerminateNotification), perform: { output in
print("TERMINATING FROM ONRECEIVE")
guard let device = BTManager.connectedDevice else { return }
BTManager.manager.cancelPeripheralConnection(device.peripheral)
})
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
log("application will terminate")
guard let device = BTManager.connectedDevice else { return }
BTManager.manager.cancelPeripheralConnection(device.peripheral)
}
操作系统或手机是否会取消待处理的功能?我很好奇为什么会发生这种情况
我不太确定您是否认为只是回家而不是真正终止该应用程序作为终止。如果此处的终止意味着关闭应用程序,然后从最近的应用程序中终止它,则可能是因为用户没有返回应用程序来终止它,因此应用程序功能将不会运行。如果应用程序未运行,我认为没有办法运行待处理的函数。
您可以添加一个用于终止的调度队列,并在其上方编写断开连接逻辑,以在终止过程中添加延迟,并为应用程序提供时间来断开与蓝牙的连接。
但是,根据经验,您不应该处理蓝牙的自动关闭,除非您的应用程序专门在蓝牙上运行并且强制为用户启动蓝牙。