|
|
@ -8,13 +8,15 @@ import UIKit |
|
|
func sendEvent(_ event: [String: Any]) |
|
|
func sendEvent(_ event: [String: Any]) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@objc class ClassicBluetoothHelper: NSObject { |
|
|
@objc class ClassicBluetoothHelper: NSObject, CBCentralManagerDelegate { |
|
|
// MARK: - 属性 |
|
|
// MARK: - 属性 |
|
|
|
|
|
|
|
|
// 音频会话管理器 |
|
|
// 音频会话管理器 |
|
|
private let audioSessionManager = AudioSessionManager.shared |
|
|
private let audioSessionManager = AudioSessionManager.shared |
|
|
|
|
|
|
|
|
|
|
|
// 蓝牙管理器 |
|
|
|
|
|
private var centralManager: CBCentralManager? |
|
|
|
|
|
|
|
|
// 事件处理器 |
|
|
// 事件处理器 |
|
|
private weak var eventHandler: BluetoothEventHandler? |
|
|
private weak var eventHandler: BluetoothEventHandler? |
|
|
|
|
|
|
|
|
@ -28,7 +30,14 @@ import UIKit |
|
|
@objc func setEventHandler(_ handler: BluetoothEventHandler) { |
|
|
@objc func setEventHandler(_ handler: BluetoothEventHandler) { |
|
|
eventHandler = handler |
|
|
eventHandler = handler |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// MARK: - CBCentralManagerDelegate |
|
|
|
|
|
|
|
|
|
|
|
func centralManagerDidUpdateState(_ central: CBCentralManager) { |
|
|
|
|
|
let stateString = getBluetoothStateString(state: central.state) |
|
|
|
|
|
sendBluetoothStateEvent(state: stateString) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// MARK: - 设备监控 |
|
|
// MARK: - 设备监控 |
|
|
|
|
|
|
|
|
@ -56,7 +65,20 @@ import UIKit |
|
|
|
|
|
|
|
|
// 启动蓝牙设备监控 |
|
|
// 启动蓝牙设备监控 |
|
|
@objc func startBluetoothDeviceMonitoring() { |
|
|
@objc func startBluetoothDeviceMonitoring() { |
|
|
|
|
|
if centralManager == nil { |
|
|
|
|
|
centralManager = CBCentralManager(delegate: self, queue: nil) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 发送当前蓝牙状态 |
|
|
|
|
|
if let manager = centralManager { |
|
|
|
|
|
let stateString = getBluetoothStateString(state: manager.state) |
|
|
|
|
|
sendBluetoothStateEvent(state: stateString) |
|
|
|
|
|
} |
|
|
|
|
|
// 移除之前的监听器 |
|
|
NotificationCenter.default.removeObserver(self) |
|
|
NotificationCenter.default.removeObserver(self) |
|
|
|
|
|
// 添加新的监听器 |
|
|
audioSessionManager.addRouteChangeListener(self, selector: #selector(handleRouteChange(_:))) |
|
|
audioSessionManager.addRouteChangeListener(self, selector: #selector(handleRouteChange(_:))) |
|
|
BluetoothMediaButtonHelper.shared.startButtonListening() |
|
|
BluetoothMediaButtonHelper.shared.startButtonListening() |
|
|
} |
|
|
} |
|
|
@ -108,23 +130,41 @@ import UIKit |
|
|
|
|
|
|
|
|
// MARK: - 设备事件 |
|
|
// MARK: - 设备事件 |
|
|
|
|
|
|
|
|
// 发送设备已连接事件 |
|
|
// 发送设备连接事件 |
|
|
private func sendDeviceConnectedEvent(device: [String: String]) { |
|
|
private func sendDeviceConnectedEvent(device: [String: String]) { |
|
|
|
|
|
guard let name = device["name"], let address = device["address"] else { return } |
|
|
|
|
|
|
|
|
|
|
|
let deviceMap: [String: Any] = [ |
|
|
|
|
|
"name": name, |
|
|
|
|
|
"address": address, |
|
|
|
|
|
"type": "headset" |
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
let event: [String: Any] = [ |
|
|
let event: [String: Any] = [ |
|
|
"type": "deviceConnected", |
|
|
"type": "deviceConnected", |
|
|
"device": device, |
|
|
"device": deviceMap, |
|
|
"timestamp": Int(Date().timeIntervalSince1970 * 1000) |
|
|
"timestamp": Int(Date().timeIntervalSince1970 * 1000) |
|
|
] |
|
|
] |
|
|
|
|
|
|
|
|
eventHandler?.sendEvent(event) |
|
|
eventHandler?.sendEvent(event) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 发送设备已断开事件 |
|
|
// 发送设备断开事件 |
|
|
private func sendDeviceDisconnectedEvent(device: [String: String]) { |
|
|
private func sendDeviceDisconnectedEvent(device: [String: String]) { |
|
|
|
|
|
guard let name = device["name"], let address = device["address"] else { return } |
|
|
|
|
|
|
|
|
|
|
|
let deviceMap: [String: Any] = [ |
|
|
|
|
|
"name": name, |
|
|
|
|
|
"address": address, |
|
|
|
|
|
"type": "headset" |
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
let event: [String: Any] = [ |
|
|
let event: [String: Any] = [ |
|
|
"type": "deviceDisconnected", |
|
|
"type": "deviceDisconnected", |
|
|
"device": device, |
|
|
"device": deviceMap, |
|
|
"timestamp": Int(Date().timeIntervalSince1970 * 1000) |
|
|
"timestamp": Int(Date().timeIntervalSince1970 * 1000) |
|
|
] |
|
|
] |
|
|
|
|
|
|
|
|
eventHandler?.sendEvent(event) |
|
|
eventHandler?.sendEvent(event) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -132,7 +172,12 @@ import UIKit |
|
|
|
|
|
|
|
|
// 获取当前连接的耳机设备 |
|
|
// 获取当前连接的耳机设备 |
|
|
@objc func getConnectedHeadsetDevices(_ completion: @escaping ([[String: String]]?, String?) -> Void) { |
|
|
@objc func getConnectedHeadsetDevices(_ completion: @escaping ([[String: String]]?, String?) -> Void) { |
|
|
|
|
|
// 检查蓝牙状态 |
|
|
|
|
|
if centralManager?.state != .poweredOn { |
|
|
|
|
|
completion(nil, "蓝牙未启用") |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
do { |
|
|
do { |
|
|
// 获取设备 |
|
|
// 获取设备 |
|
|
let devices = getConnectedAudioDevices() |
|
|
let devices = getConnectedAudioDevices() |
|
|
@ -160,11 +205,18 @@ import UIKit |
|
|
|
|
|
|
|
|
return result |
|
|
return result |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 释放资源 |
|
|
|
|
|
@objc func dispose() { |
|
|
|
|
|
audioSessionManager.removeRouteChangeListener(self) |
|
|
|
|
|
eventHandler = nil |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 检查蓝牙是否启用 |
|
|
// 检查蓝牙是否启用 |
|
|
@objc func isBluetoothEnabled() -> Bool { |
|
|
@objc func isBluetoothEnabled() -> Bool { |
|
|
return audioSessionManager.isBluetoothEnabled() |
|
|
return centralManager?.state == .poweredOn |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 清理设备地址,移除后缀 |
|
|
// 清理设备地址,移除后缀 |
|
|
|