swift 无法从bundle加载HTML

k5ifujac  于 2023-05-16  发布在  Swift
关注(0)|答案(1)|浏览(170)

我试图从Bundle加载一个HTML文件。这是我使用的代码

let fileUrl = Bundle.main.url(forResource: "index", withExtension: "html")!
webView.loadFileURL(fileUrl, allowingReadAccessTo: fileUrl)

如果它是一个简单的HTML文件,我看到WKWebview加载它们很好。但是现在我正在尝试加载使用React Native创建的HTML。我不认为React原生Web代码有任何问题,因为它在本地加载良好。
在检查日志时,我发现它无法加载 *.js文件。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta httpEquiv="X-UA-Compatible" content="IE=edge" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1.00001, viewport-fit=cover"
    />
    <title>Bundle HTML</title>
 </head>
    <div id="root"></div>
  <script src="/bundles/web-4587a25eab359d254810d3f9017eb281.js"></script>
</html>

不知道为什么这个js和其他资源加载不好。你知道吗?
我还为WKWebView添加了以下配置。allowsContentJavaScript为true,allowFileAccessFromFileURLs为true

vm0i2vca

vm0i2vca1#

找不到此路径资源:

<script src="/bundles/web-4587a25eab359d254810d3f9017eb281.js"></script>

您应该手动将此路径替换为应用程序包中的真实的路径,因此最终代码可能如下所示

// Get the URL for index.html
guard let fileUrl = Bundle.main.url(forResource: "index", withExtension: "html") else {
    fatalError("Failed to load index.html")
}

do {
    // Load the HTML file into a string
    let htmlString = try String(contentsOf: fileUrl)

    // Find and replace the bundle path with a new path inside the main bundle
    let bundlePath = Bundle.main.path(forResource: "web-4587a25eab359d254810d3f9017eb281", ofType: "js")!
    let newHtmlString = htmlString.replacingOccurrences(of: "/bundles/web-4587a25eab359d254810d3f9017eb281.js", with: bundlePath)

    // Load the modified HTML string into the web view
    webView.loadHTMLString(newHtmlString, baseURL: fileUrl)
} catch {
    print("Error loading HTML file: \(error)")
}

另一个更好的方法是使用func loadHTMLString(_ string: String, baseURL: URL?),baseURL在这里的意思是:
系统解析HTML字符串中的相对URL时要使用的基URL。

// Load the HTML file into a string
guard let htmlFilePath = Bundle.main.path(forResource: "index", ofType: "html"),
      let htmlString = try? String(contentsOfFile: htmlFilePath)
else { return }
 
//TODO: Set the base URL to the directory containing the `bundles/xxxx.js` folder, or you can set it 
let baseURL = URL(fileURLWithPath: bundleParentPath)
 
// Load the HTML string into a WKWebView
webView.loadHTMLString(htmlString, baseURL: baseURL)

相关问题