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

SwiftUI中WKWebView如何在通知触发时切换URL并退出应用

解决方案

要实现收到指定通知后先加载断开连接的HTML页面再退出应用,你需要调整WebView的逻辑,确保页面加载完成后再执行退出操作,具体步骤如下:

1. 改造WebView组件

让WebView支持页面加载完成的回调,并添加导航代理监听加载状态:

import SwiftUI
import WebKit

struct WebView: UIViewRepresentable{
    var url: URL
    var onPageLoaded: () -> Void // 页面加载完成回调
    
    func makeUIView(context: Context) -> WKWebView {
        let webView = WKWebView()
        webView.navigationDelegate = context.coordinator
        return webView
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context){
        let request = URLRequest(url: url)
        // 避免重复加载相同URL
        if uiView.url != url {
            uiView.load(request)
        }
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject, WKNavigationDelegate {
        var parent: WebView
        
        init(_ parent: WebView) {
            self.parent = parent
        }
        
        // 监听页面加载完成事件
        func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
            parent.onPageLoaded()
        }
    }
}

2. 调整ContentView逻辑

在ContentView中处理通知事件,切换到断开连接页面,并在页面加载完成后退出应用:

struct ContentView: View {
    @State private var urlString: String = "初始页面URL"
    @State private var shouldExitAfterLoad = false // 标记是否需要在页面加载完成后退出
    
    var body: some View {
        VStack (spacing: 40){
            // 安全处理URL可选值,避免崩溃
            if let url = URL(string: urlString) {
                WebView(url: url, onPageLoaded: {
                    // 页面加载完成后,若标记为需要退出则执行退出
                    if shouldExitAfterLoad {
                        exit(0)
                    }
                })
            } else {
                Text("无效的URL")
            }
        }
        .onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { _ in
            triggerDisconnectAndExit()
        }
        .onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
            triggerDisconnectAndExit()
        }
    }
    
    // 封装切换页面并准备退出的逻辑
    private func triggerDisconnectAndExit() {
        // 替换为你的断开连接HTML页面URL(本地或远程均可)
        urlString = "https://your-domain.com/disconnect.html"
        // 或者如果是本地HTML文件:
        // if let localUrl = Bundle.main.url(forResource: "disconnect", withExtension: "html") {
        //     urlString = localUrl.absoluteString
        // }
        shouldExitAfterLoad = true
    }
}

重要注意事项

  • 关于exit(0):iOS平台不推荐应用主动调用exit(0)退出,Apple审核时可能会拒绝此类应用。如果业务允许,建议改为让页面自行处理断开逻辑,而非强制退出应用。
  • URL安全处理:原代码中强制解包URL(string: urlString)!容易导致崩溃,建议使用if let或guard let处理可选值。
  • 本地HTML文件:如果使用本地HTML文件,需确保文件已添加到项目的Bundle中,并正确获取其URL。

内容的提问来源于stack exchange,提问作者pablo mateos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:07:45