55 lines
1.3 KiB
Swift
55 lines
1.3 KiB
Swift
// Author: fruit.com.cn
|
|
|
|
import CoreTelephony
|
|
import Flutter
|
|
import Foundation
|
|
|
|
/// 监听系统无线数据选择,供 Flutter 在首个接口请求前等待。
|
|
final class WirelessDataPrompt {
|
|
static let channelName = "com.stormg.lumadrama/wireless-data"
|
|
static let awaitDecisionMethod = "awaitDecision"
|
|
|
|
private let cellularData = CTCellularData()
|
|
private let lock = NSLock()
|
|
private var pending: [FlutterResult] = []
|
|
private var decided = false
|
|
|
|
init() {
|
|
cellularData.cellularDataRestrictionDidUpdateNotifier = { [weak self] state in
|
|
DispatchQueue.main.async {
|
|
self?.completeIfDecided(state)
|
|
}
|
|
}
|
|
}
|
|
|
|
/// 状态未选择时先挂起;用户点选后完成全部等待。
|
|
func awaitDecision(_ result: @escaping FlutterResult) {
|
|
lock.lock()
|
|
if decided {
|
|
lock.unlock()
|
|
DispatchQueue.main.async {
|
|
result(nil)
|
|
}
|
|
return
|
|
}
|
|
pending.append(result)
|
|
lock.unlock()
|
|
}
|
|
|
|
private func completeIfDecided(_ state: CTCellularDataRestrictedState) {
|
|
if state == .restrictedStateUnknown {
|
|
return
|
|
}
|
|
lock.lock()
|
|
if decided {
|
|
lock.unlock()
|
|
return
|
|
}
|
|
decided = true
|
|
let waiters = pending
|
|
pending.removeAll()
|
|
lock.unlock()
|
|
waiters.forEach { $0(nil) }
|
|
}
|
|
}
|