WKWebView中Google幻灯片全屏失效及一键返回首页需求咨询
解决WKWebView中Google幻灯片返回需多次点击的问题
我之前也踩过Google幻灯片在WKWebView里的这个坑,结合iOS的WebView特性,给你几个能直接改善用户体验的实用方案:
方案1:自定义返回按钮,一步跳回应用首页
既然每一页幻灯片都会生成独立URL导致返回栈臃肿,不如直接绕过系统默认的返回逻辑,给返回按钮自定义行为:
// 替换导航栏默认的返回按钮 navigationItem.leftBarButtonItem = UIBarButtonItem(title: "返回", style: .plain, target: self, action: #selector(navigateBackToHome)) @objc private func navigateBackToHome() { // 判断当前是否处于Google幻灯片页面 if let currentURL = webView.url, currentURL.host?.contains("google.com") == true { // 直接加载应用首页的URL let homeURL = URL(string: "你的应用首页地址")! webView.load(URLRequest(url: homeURL)) } else { // 非幻灯片页面按正常逻辑返回 if webView.canGoBack { webView.goBack() } else { navigationController?.popViewController(animated: true) } } }
这个方案最直接,用户点击一次返回就能回到应用首页,完全不用逐页点击。
方案2:用SFSafariViewController打开幻灯片链接
如果不需要和Google幻灯片页面做JS交互,强烈推荐用SFSafariViewController跳转——用户看完幻灯片后,点击左上角返回按钮直接回到你的应用,根本不会出现逐页返回的问题:
import SafariServices // 跳转幻灯片链接时,替换成SFSafariViewController打开 let slideURL = URL(string: "你的Google幻灯片独立URL")! let safariVC = SFSafariViewController(url: slideURL) present(safariVC, animated: true)
这个方案不用处理WKWebView的栈问题,系统帮你搞定了返回逻辑,体验完全符合用户预期。
方案3:拦截幻灯片内部跳转,合并导航栈
如果必须用WKWebView加载,还可以拦截幻灯片的翻页导航,不让每一页都加入返回栈:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { guard let requestURL = navigationAction.request.url else { decisionHandler(.allow) return } // 根据Google幻灯片的URL特征判断是否为内部翻页跳转 if requestURL.host == "docs.google.com" && requestURL.path.contains("/presentation/d/") && requestURL.path.contains("/slide/") { // 取消默认导航,替换当前栈条目加载新页面 webView.load(navigationAction.request) webView.replaceCurrentHistoryItem(with: WKBackForwardListItem(url: requestURL, title: "")) decisionHandler(.cancel) } else { decisionHandler(.allow) } }
这个方案需要根据实际的幻灯片URL结构调整判断逻辑,调整后返回栈里只会保留一个幻灯片页面,用户点一次返回就回到应用首页。
内容的提问来源于stack exchange,提问作者frenkowski
相关产品推荐
相关产品推荐

