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

Vue.js在WKWebView中显示空白页面问题排查求助

Vue.js页面在WKWebView中显示空白且无错误捕获的排查方案

Vue.js页面在WKWebView中显示空白,已添加webView(_:didFailProvisionalNavigation:withError:)和webView(_:decidePolicyFor:decisionHandler:)两个代理方法排查错误,但未捕获到任何错误信息。

相关代码

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {
    
    @IBOutlet weak var container: UIView!
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var logTextView: UITextView!
    
    var webView: WKWebView?
    var javascript: Javascript?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        var webFrame = self.container!.frame
        webFrame.origin.x = 0
        webFrame.origin.y = 0
        
        // Create a configuration for the preferences
        
        
        let config = WKWebViewConfiguration()
        config.defaultWebpagePreferences.allowsContentJavaScript = true
       
        self.webView = WKWebView(frame: webFrame, configuration: config)
        self.webView?.configuration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs")

        self.container!.addSubview(webView!)
        
        let testUrl: URL! = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "dist")
       
        self.webView!.loadFileURL(testUrl, allowingReadAccessTo: testUrl)
        self.javascript = Javascript(webView: self.webView!)
        self.webView?.navigationDelegate = self
    }
    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
        print(error.localizedDescription)
    }
    
    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse,
                 decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
        
        if let response = navigationResponse.response as? HTTPURLResponse {
            print(response.statusCode)
            if response.statusCode == 401 {
                // ...
            }
        }
        decisionHandler(.allow)
    }
}

排查建议

  • 修正Vue打包的publicPath配置
    Vue CLI默认打包的publicPath为/,本地文件协议(file://)加载时会导致资源路径错误,需改为相对路径:
    在项目根目录的vue.config.js中添加或修改:
module.exports = {
  publicPath: './'
}

重新打包后替换Xcode项目中的dist文件夹。

  • 调整文件访问权限路径
    loadFileURL的allowingReadAccessTo参数应传入dist目录的URL,而非单个index.html的URL,确保WebView有权限访问目录下的所有资源:
guard let distUrl = Bundle.main.url(forResource: "dist", withExtension: nil),
      let testUrl = distUrl.appendingPathComponent("index.html") else {
    print("无法找到dist目录或index.html")
    return
}
self.webView!.loadFileURL(testUrl, allowingReadAccessTo: distUrl)
  • 补充代理方法捕获更多细节
    当前代理未覆盖所有加载场景,添加以下方法获取更全面的加载状态:
// 页面加载完成回调,验证是否渲染成功
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    print("页面加载完成")
    // 执行JS获取页面内容,确认是否有渲染结果
    webView.evaluateJavaScript("document.body.innerHTML") { result, error in
        if let htmlContent = result as? String {
            print("页面渲染内容:\(htmlContent)")
        } else if let err = error {
            print("获取页面内容失败:\(err.localizedDescription)")
        }
    }
}

// 捕获页面加载过程中的错误
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
    print("页面加载错误:\(error.localizedDescription)")
}

// 打印所有请求URL,排查资源加载路径
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if let requestUrl = navigationAction.request.url {
        print("请求资源:\(requestUrl.absoluteString)")
    }
    decisionHandler(.allow)
}
  • 确认WKWebView配置有效性
    确保JavaScript权限和文件访问权限配置正确,建议在创建配置时直接设置:
let preferences = WKPreferences()
preferences.setValue(true, forKey: "allowFileAccessFromFileURLs")

let config = WKWebViewConfiguration()
config.defaultWebpagePreferences.allowsContentJavaScript = true
config.preferences = preferences

self.webView = WKWebView(frame: webFrame, configuration: config)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:02:36