Files
ReelShort/ios/Runner/WirelessDataPrompt.swift
T
Zhou Weidong b5e9deb4bd feat(ios): 首次启动询问无线数据权限
iOS 在首个接口请求前等待系统无线数据选择,避免未授权时请求被静默拒绝。
2026-10-25 21:23:25 +08:00

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