如何在SwiftUI中在后台进行蓝牙操作



我试图在后台监听我的蓝牙设备,但似乎什么都没发生。我试着在这里遵循这个指南,并为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来启动连接请求。一旦你以前见过它,就没有必要扫描它(这是不鼓励的,因为扫描速度慢且耗电量大(。

连接请求永远不会超时。当应用程序进入后台时,请求将继续。如果应用程序终止或设备重新启动,它甚至会继续。连接请求可能会运行数周。这是完全好的,预期和电池效率。

当设备打开并且处于可连接范围内时,操作系统将处理连接。然后,它将在后台将控制权交给你的应用程序,或者使用状态恢复启动你的应用。在这一点上,你可以用连接的设备做任何你想做的事情。

相关内容

  • 没有找到相关文章

最新更新