// 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) } } }