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
相关产品推荐
相关产品推荐

