import Foundation import Network import SwiftUI class NetworkPermissionManager: ObservableObject { @Published var isNetworkAvailable = false @Published var isCheckingNetwork = true @Published var showNetworkPermissionAlert = false private let monitor = NWPathMonitor() private let queue = DispatchQueue(label: "NetworkMonitor") init() { startNetworkMonitoring() } deinit { monitor.cancel() } private func startNetworkMonitoring() { monitor.pathUpdateHandler = { [weak self] path in DispatchQueue.main.async { self?.isNetworkAvailable = path.status == .satisfied self?.isCheckingNetwork = false // 如果网络不可用,显示权限提示 if path.status != .satisfied { self?.showNetworkPermissionAlert = true } } } monitor.start(queue: queue) } func checkNetworkPermission() { isCheckingNetwork = true // 重新开始监控 monitor.cancel() startNetworkMonitoring() } func openNetworkSettings() { if let settingsUrl = URL(string: UIApplication.openSettingsURLString) { if UIApplication.shared.canOpenURL(settingsUrl) { UIApplication.shared.open(settingsUrl) } } } } // 网络权限检查视图 struct NetworkPermissionView: View { @ObservedObject var networkManager: NetworkPermissionManager let onPermissionGranted: () -> Void var body: some View { VStack(spacing: 30) { // 网络图标 Image(systemName: "wifi.slash") .font(.system(size: 80, weight: .light)) .foregroundColor(.white.opacity(0.8)) VStack(spacing: 15) { Text("network_permission_required".localized) .font(.system(size: 28, weight: .bold)) .foregroundColor(.white) Text("network_permission_description".localized) .font(.system(size: 16, weight: .medium)) .foregroundColor(.white.opacity(0.8)) .multilineTextAlignment(.center) .padding(.horizontal, 40) } VStack(spacing: 20) { // 检查网络按钮 Button(action: { networkManager.checkNetworkPermission() }) { HStack { if networkManager.isCheckingNetwork { ProgressView() .progressViewStyle(CircularProgressViewStyle(tint: .white)) .scaleEffect(0.8) } else { Image(systemName: "arrow.clockwise") } Text(networkManager.isCheckingNetwork ? "checking_network".localized : "check_network".localized) } .font(.system(size: 16, weight: .medium)) .foregroundColor(.white) .frame(maxWidth: .infinity) .frame(height: 50) .background( RoundedRectangle(cornerRadius: 25) .fill(Color.white.opacity(0.2)) ) } .disabled(networkManager.isCheckingNetwork) // 打开设置按钮 Button(action: { networkManager.openNetworkSettings() }) { HStack { Image(systemName: "gear") Text("open_settings".localized) } .font(.system(size: 16, weight: .medium)) .foregroundColor(.white) .frame(maxWidth: .infinity) .frame(height: 50) .background( RoundedRectangle(cornerRadius: 25) .fill(Color.blue.opacity(0.8)) ) } } .padding(.horizontal, 40) } .onChange(of: networkManager.isNetworkAvailable) { isAvailable in if isAvailable { onPermissionGranted() } } } }