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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:13:24