|
|
|
@ -23,6 +23,8 @@ final class SmartcarBleCentral: NSObject { |
|
|
|
|
|
|
|
private var central: CBCentralManager? |
|
|
|
private var discovered: [UUID: CBPeripheral] = [:] |
|
|
|
/// 扫描时广播里带的本地名(按设备 UUID)。设备名一律优先用它,见 didDiscover 的注释 |
|
|
|
private(set) var advertisedNames: [UUID: String] = [:] |
|
|
|
private(set) var active: SmartcarPeripheral? |
|
|
|
|
|
|
|
var onAdapterState: ((String) -> Void)? |
|
|
|
@ -161,6 +163,7 @@ final class SmartcarBleCentral: NSObject { |
|
|
|
return cur |
|
|
|
} |
|
|
|
let sp = SmartcarPeripheral(peripheral: p, central: central, delegate: delegate) |
|
|
|
sp.advertisedName = advertisedNames[p.identifier] |
|
|
|
active = sp |
|
|
|
sp.connect() |
|
|
|
return sp |
|
|
|
@ -196,8 +199,16 @@ extension SmartcarBleCentral: CBCentralManagerDelegate { |
|
|
|
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, |
|
|
|
advertisementData: [String: Any], rssi RSSI: NSNumber) { |
|
|
|
discovered[peripheral.identifier] = peripheral |
|
|
|
let name = peripheral.name |
|
|
|
?? (advertisementData[CBAdvertisementDataLocalNameKey] as? String) |
|
|
|
// ⚠️ 先取广播本地名,再退回 peripheral.name(2026-09-26)。 |
|
|
|
// peripheral.name 是 iOS 缓存的 GAP 名:这台 iPhone 以前连过、那时固件还叫 Smartcar, |
|
|
|
// 固件改名 EaiCar 之后缓存不会跟着更新,扫描上报的一直是旧名 → 准入白名单只认 EaiCar, |
|
|
|
// 于是「厂商 ID、MAC 都对,iPhone 就是扫不到」,而安卓读的是广播名、一切正常。 |
|
|
|
let advName = (advertisementData[CBAdvertisementDataLocalNameKey] as? String)? |
|
|
|
.trimmingCharacters(in: .whitespaces) |
|
|
|
if let n = advName, !n.isEmpty { advertisedNames[peripheral.identifier] = n } |
|
|
|
let name = (advName?.isEmpty == false ? advName : nil) |
|
|
|
?? advertisedNames[peripheral.identifier] |
|
|
|
?? peripheral.name |
|
|
|
?? "" |
|
|
|
let mfg = advertisementData[CBAdvertisementDataManufacturerDataKey] as? Data |
|
|
|
let svcs = (advertisementData[CBAdvertisementDataServiceUUIDsKey] as? [CBUUID])? |
|
|
|
|