You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中点击按钮终止iOS应用的合规实现方案咨询

Swift 实现无网络场景的合规处理方案

核心原则:遵循 Apple 审核规则

Apple 明确禁止应用通过调用 exit(0) 或类似方式自行终止进程,这类操作会破坏用户对应用生命周期的预期,大概率导致审核被拒。正确的做法是引导用户主动操作,或让应用进入不可用状态而非强制退出。

具体实现步骤

  1. 检测网络连接
    使用 NWPathMonitor 监控网络状态(需导入 Network 框架):
import Network

class NetworkMonitor {
    static let shared = NetworkMonitor()
    private let monitor: NWPathMonitor
    private let queue = DispatchQueue(label: "NetworkMonitor")
    
    var isConnected: Bool = false
    
    private init() {
        monitor = NWPathMonitor()
        monitor.pathUpdateHandler = { path in
            self.isConnected = path.status == .satisfied
        }
        monitor.start(queue: queue)
    }
}
  1. 启动时检测并弹出提示弹窗
    在 AppDelegate 或 SceneDelegate 的启动方法中,检测网络状态,若无连接则弹出提示:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    if !NetworkMonitor.shared.isConnected {
        DispatchQueue.main.async {
            self.showNetworkRequiredAlert()
        }
    }
    return true
}

private func showNetworkRequiredAlert() {
    let alert = UIAlertController(title: "无网络连接", message: "本应用需要网络才能运行,请启用移动数据或连接WiFi。", preferredStyle: .alert)
    
    // 引导至设置按钮
    let settingsAction = UIAlertAction(title: "去设置", style: .default) { _ in
        guard let settingsURL = URL(string: UIApplication.openSettingsURLString) else { return }
        if UIApplication.shared.canOpenURL(settingsURL) {
            UIApplication.shared.open(settingsURL)
        }
    }
    
    // 拒绝按钮
    let declineAction = UIAlertAction(title: "拒绝", style: .destructive) { _ in
        self.showExitPrompt()
    }
    
    alert.addAction(settingsAction)
    alert.addAction(declineAction)
    
    // 获取当前根控制器并弹窗
    if let rootVC = UIApplication.shared.windows.first?.rootViewController {
        rootVC.present(alert, animated: true)
    }
}
  1. 处理“拒绝”操作的合规方式
    点击“拒绝”后,不能直接终止应用,而是显示提示引导用户手动关闭,同时让应用进入不可交互状态:
private func showExitPrompt() {
    let exitAlert = UIAlertController(title: "应用无法运行", message: "没有网络连接,应用无法正常使用,请手动关闭应用后重新尝试。", preferredStyle: .alert)
    
    let okAction = UIAlertAction(title: "知道了", style: .default) { _ in
        // 将应用切换到后台,引导用户手动关闭
        UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
    }
    
    exitAlert.addAction(okAction)
    
    if let rootVC = UIApplication.shared.windows.first?.rootViewController {
        rootVC.present(exitAlert, animated: true)
    }
}

额外注意事项

  • 避免强制终止:任何主动终止进程的操作(如 exit(0)、abort())都会违反 Apple 的审核规范,务必避免。
  • 优化用户体验:尽量引导用户开启网络,而非直接走向“拒绝”终止的路径,提供清晰的操作指引。
  • 持续监控网络:在用户从设置返回应用后,重新检测网络状态,若已连接则恢复应用正常流程。

内容的提问来源于stack exchange,提问作者Louiza A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:41:01