You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
6.3 KiB
192 lines
6.3 KiB
import Flutter
|
|
import UIKit
|
|
|
|
@main
|
|
@objc class AppDelegate: FlutterAppDelegate {
|
|
private var classicBluetoothHelper: ClassicBluetoothHelper?
|
|
private var mediaButtonHelper: Any?
|
|
|
|
override func application(
|
|
_ application: UIApplication,
|
|
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
|
) -> Bool {
|
|
// 初始化蓝牙辅助类
|
|
classicBluetoothHelper = ClassicBluetoothHelper()
|
|
|
|
// 立即初始化蓝牙,不要等待Flutter调用
|
|
classicBluetoothHelper?.initBluetooth()
|
|
|
|
// 仅在iOS 13.0及以上版本初始化媒体按钮辅助类
|
|
if #available(iOS 13.0, *) {
|
|
mediaButtonHelper = BluetoothMediaButtonHelper()
|
|
}
|
|
|
|
// 建立Flutter方法通道
|
|
registerMethodChannel()
|
|
|
|
GeneratedPluginRegistrant.register(with: self)
|
|
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
|
}
|
|
|
|
private func registerMethodChannel() {
|
|
let controller = window?.rootViewController as? FlutterViewController
|
|
guard let controller = controller else {
|
|
NSLog("AppDelegate: FlutterViewController 不可用")
|
|
return
|
|
}
|
|
|
|
// 注册经典蓝牙通道
|
|
let classicChannel = FlutterMethodChannel(
|
|
name: "com.deep_voice.classic_bluetooth",
|
|
binaryMessenger: controller.binaryMessenger
|
|
)
|
|
|
|
classicChannel.setMethodCallHandler { [weak self] (call, result) in
|
|
guard let self = self else {
|
|
result(FlutterError(code: "UNAVAILABLE", message: "AppDelegate实例不可用", details: nil))
|
|
return
|
|
}
|
|
|
|
switch call.method {
|
|
case "isBluetoothEnabled":
|
|
result(self.classicBluetoothHelper?.isBluetoothEnabled() ?? false)
|
|
|
|
case "getConnectedHeadsetDevices":
|
|
// 获取已连接的耳机设备
|
|
self.classicBluetoothHelper?.getConnectedHeadsetDevices { devices, error in
|
|
if let error = error {
|
|
result(FlutterError(code: "GET_DEVICES_FAILED", message: error, details: nil))
|
|
} else {
|
|
result(devices)
|
|
}
|
|
}
|
|
|
|
case "startBluetoothDeviceMonitoring":
|
|
// 启动蓝牙设备监控
|
|
self.classicBluetoothHelper?.initBluetooth()
|
|
result(true)
|
|
|
|
default:
|
|
result(FlutterMethodNotImplemented)
|
|
}
|
|
}
|
|
|
|
// 注册蓝牙事件通道
|
|
let classicEventChannel = FlutterEventChannel(
|
|
name: "com.deep_voice.classic_bluetooth_events",
|
|
binaryMessenger: controller.binaryMessenger
|
|
)
|
|
|
|
// 创建事件处理器
|
|
let bluetoothEventHandler = BluetoothStreamHandler(bluetoothHelper: self.classicBluetoothHelper!)
|
|
classicEventChannel.setStreamHandler(bluetoothEventHandler)
|
|
|
|
// 仅在iOS 13.0及以上版本注册媒体按钮通道
|
|
if #available(iOS 13.0, *), let mediaButtonHelper = mediaButtonHelper as? BluetoothMediaButtonHelper {
|
|
// 注册媒体按钮方法通道
|
|
let mediaButtonChannel = FlutterMethodChannel(
|
|
name: "com.deep_voice.bluetooth_media_button",
|
|
binaryMessenger: controller.binaryMessenger
|
|
)
|
|
|
|
mediaButtonChannel.setMethodCallHandler { [weak self, weak mediaButtonHelper] (call, result) in
|
|
guard let _ = self, let mediaButtonHelper = mediaButtonHelper else {
|
|
result(FlutterError(code: "UNAVAILABLE", message: "媒体按钮辅助实例不可用", details: nil))
|
|
return
|
|
}
|
|
|
|
switch call.method {
|
|
case "startButtonListening":
|
|
let success = mediaButtonHelper.startButtonListening()
|
|
result(success)
|
|
|
|
case "stopButtonListening":
|
|
let success = mediaButtonHelper.stopButtonListening()
|
|
result(success)
|
|
|
|
default:
|
|
result(FlutterMethodNotImplemented)
|
|
}
|
|
}
|
|
|
|
// 注册媒体按钮事件通道
|
|
let mediaButtonEventChannel = FlutterEventChannel(
|
|
name: "com.deep_voice.bluetooth_media_button_events",
|
|
binaryMessenger: controller.binaryMessenger
|
|
)
|
|
|
|
// 创建媒体按钮事件处理器
|
|
let mediaButtonEventHandler = MediaButtonStreamHandler(mediaButtonHelper: mediaButtonHelper)
|
|
mediaButtonEventChannel.setStreamHandler(mediaButtonEventHandler)
|
|
}
|
|
}
|
|
}
|
|
|
|
// 蓝牙事件流处理器
|
|
class BluetoothStreamHandler: NSObject, FlutterStreamHandler, BluetoothEventHandler {
|
|
private let bluetoothHelper: ClassicBluetoothHelper
|
|
private var eventSink: FlutterEventSink?
|
|
|
|
init(bluetoothHelper: ClassicBluetoothHelper) {
|
|
self.bluetoothHelper = bluetoothHelper
|
|
super.init()
|
|
|
|
// 设置事件处理器
|
|
bluetoothHelper.setEventHandler(self)
|
|
}
|
|
|
|
func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
|
|
NSLog("BluetoothStreamHandler: 开始监听蓝牙事件")
|
|
self.eventSink = events
|
|
return nil
|
|
}
|
|
|
|
func onCancel(withArguments arguments: Any?) -> FlutterError? {
|
|
NSLog("BluetoothStreamHandler: 取消监听蓝牙事件")
|
|
eventSink = nil
|
|
return nil
|
|
}
|
|
|
|
// 实现BluetoothEventHandler协议
|
|
func sendEvent(_ event: [String: Any]) {
|
|
NSLog("BluetoothStreamHandler: 接收到蓝牙事件: \(event)")
|
|
DispatchQueue.main.async { [weak self] in
|
|
self?.eventSink?(event)
|
|
}
|
|
}
|
|
}
|
|
|
|
// 媒体按钮事件流处理器
|
|
@available(iOS 13.0, *)
|
|
class MediaButtonStreamHandler: NSObject, FlutterStreamHandler, MediaButtonEventHandler {
|
|
private let mediaButtonHelper: BluetoothMediaButtonHelper
|
|
private var eventSink: FlutterEventSink?
|
|
|
|
init(mediaButtonHelper: BluetoothMediaButtonHelper) {
|
|
self.mediaButtonHelper = mediaButtonHelper
|
|
super.init()
|
|
|
|
// 设置事件处理器
|
|
mediaButtonHelper.setEventHandler(self)
|
|
}
|
|
|
|
func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
|
|
NSLog("MediaButtonStreamHandler: 开始监听媒体按钮事件")
|
|
self.eventSink = events
|
|
return nil
|
|
}
|
|
|
|
func onCancel(withArguments arguments: Any?) -> FlutterError? {
|
|
NSLog("MediaButtonStreamHandler: 取消监听媒体按钮事件")
|
|
eventSink = nil
|
|
return nil
|
|
}
|
|
|
|
// 实现MediaButtonEventHandler协议
|
|
func sendEvent(_ event: [String: Any]) {
|
|
NSLog("MediaButtonStreamHandler: 收到按钮事件 \(event)")
|
|
DispatchQueue.main.async { [weak self] in
|
|
self?.eventSink?(event)
|
|
}
|
|
}
|
|
}
|
|
|