我试图在后台监听我的蓝牙设备,但似乎什么都没发生。我试着在这里遵循这个指南,并为SwiftUI修改它。
https://developer.apple.com/library/archive/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html
我启用了bluetooth-central
后台模式。
我选择加入国家保护和恢复。
let options = [CBCentralManagerOptionRestoreIdentifierKey : "myCentralManagerIdentifier"]
centralManager = CBCentralManager(delegate: self, queue: nil, options: options)
我添加了恢复委托方法。当我第一次再次运行应用程序时,会调用此方法。
func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any]) {
guard let peripherals = dict[CBCentralManagerRestoredStatePeripheralsKey] as? [CBPeripheral] else {
return
}
for peripheral in peripherals {
// ...
}
}
启动选项的步骤似乎对我不起作用。launchOptions
字典对我来说总是nil
。
import SwiftUI
import UIKit
class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
guard let options = launchOptions else {
return true
}
let centralManagerIdentifiers = options[UIApplication.LaunchOptionsKey.bluetoothCentrals]
return true
}
}
@main
struct MyApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
一旦知道设备的peripheralID
,无论是否连接,都可以随时使用retrievePeripherals(withIdentifiers:)
为其获取CBPeripheral。如果它没有连接,您可以直接调用connect
来启动连接请求。一旦你以前见过它,就没有必要扫描它(这是不鼓励的,因为扫描速度慢且耗电量大(。
连接请求永远不会超时。当应用程序进入后台时,请求将继续。如果应用程序终止或设备重新启动,它甚至会继续。连接请求可能会运行数周。这是完全好的,预期和电池效率。
当设备打开并且处于可连接范围内时,操作系统将处理连接。然后,它将在后台将控制权交给你的应用程序,或者使用状态恢复启动你的应用。在这一点上,你可以用连接的设备做任何你想做的事情。