iOS WebView应用特定登录URL无法弹窗加载问题求助
解决方案:让Google登录URL在WebView弹窗中打开
针对你遇到的Google登录在WebView内被拦截的问题,核心思路是拦截特定登录跳转URL,用自定义弹窗WebView加载,以下是具体实现步骤:
1. 配置主WebView的导航拦截逻辑
找到你项目中主WebView所在的ViewController,实现WKNavigationDelegate来拦截Google登录相关的URL跳转:
import UIKit import WebKit class MainWebViewController: UIViewController, WKNavigationDelegate { @IBOutlet weak var mainWebView: WKWebView! override func viewDidLoad() { super.viewDidLoad() mainWebView.navigationDelegate = self // 加载你的fieldd.co服务页面 if let targetURL = URL(string: "https://your-fieldd-service-url.com") { mainWebView.load(URLRequest(url: targetURL)) } } // 拦截跳转请求 func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { guard let requestURL = navigationAction.request.url else { decisionHandler(.allow) return } // 匹配Google登录相关域名(根据实际URL调整) let loginTargetDomains = ["accounts.google.com", "your-firebase-auth-handler-url.com"] let isLoginURL = loginTargetDomains.contains { requestURL.host?.contains($0) ?? false } if isLoginURL { // 弹出自定义WebView弹窗加载登录页 let popupVC = WebPopupViewController() popupVC.urlString = requestURL.absoluteString popupVC.modalPresentationStyle = .pageSheet present(popupVC, animated: true) decisionHandler(.cancel) // 取消主WebView内的跳转 } else { decisionHandler(.allow) } } }
2. 修正自定义弹窗WebViewController的代码
你原有的WebPopupViewController存在IBOutlet被覆盖的问题,以下是修正后的版本:
import UIKit import WebKit class WebPopupViewController: UIViewController, WKNavigationDelegate { var urlString: String? @IBOutlet var viewWeb: WKWebView! // 保留storyboard绑定的IBOutlet override func viewDidLoad() { super.viewDidLoad() setupWebView() loadURL() setupCloseButton() } private func setupWebView() { // 仅配置代理和自动布局,不重新实例化WKWebView(避免覆盖IBOutlet) viewWeb.navigationDelegate = self viewWeb.autoresizingMask = [.flexibleWidth, .flexibleHeight] } private func loadURL() { guard let urlString = urlString, let targetURL = URL(string: urlString) else { print("Invalid URL provided to WebPopupViewController") return } viewWeb.load(URLRequest(url: targetURL)) } private func setupCloseButton() { let closeButton = UIButton(frame: CGRect(x: 16, y: view.safeAreaInsets.top + 16, width: 80, height: 40)) closeButton.setTitle("Close", for: .normal) closeButton.setTitleColor(.systemBlue, for: .normal) closeButton.backgroundColor = #available(iOS 13.0, *) ? .systemGray6 : .lightGray closeButton.layer.cornerRadius = 8 closeButton.addTarget(self, action: #selector(closePopup), for: .touchUpInside) view.addSubview(closeButton) } @objc private func closePopup() { dismiss(animated: true, completion: nil) } // 可选:登录成功后自动关闭弹窗(根据实际回调URL调整匹配规则) func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { guard let currentURL = webView.url else { return } if currentURL.absoluteString.contains("login-success") { closePopup() } } }
3. 关键注意事项
- ATS配置:在
Info.plist中添加NSAppTransportSecurity字典,确保允许Google登录和Firebase相关域名的网络访问(可设置NSAllowsArbitraryLoads为YES,或更严格的NSExceptionDomains规则)。 - Firebase配置:确认Firebase控制台已添加你的iOS应用Bundle ID,且回调URL配置正确。
- 模板适配:如果使用RocketWeb模板,找到模板中主WebView的
navigationDelegate设置位置,替换或添加上述拦截逻辑即可。
内容的提问来源于stack exchange,提问作者Heisenberg
相关产品推荐
相关产品推荐

