在 WKWebView (iOS, Swift) 中使用本地 Javascript 源加载本地 HTML
Posted
技术标签:
【中文标题】在 WKWebView (iOS, Swift) 中使用本地 Javascript 源加载本地 HTML【英文标题】:Loading local HTML with local Javascript Sources in a WKWebView (iOS, Swift) 【发布时间】:2018-11-03 15:58:02 【问题描述】:我正在尝试在 ios 应用程序 (Swift 4.2) 的 WKWebView 中加载本地 html 文件。不幸的是,这个本地文件包含似乎没有被执行的 javascript 代码。
下面是这个html文件(取自https://www.verovio.org/tutorial.xhtml?id=topic00):
<html>
<head>
<title>Verovio Hello World! example</title>
<script src="verovio-toolkit.js" type="text/javascript" ></script>
<script src="jquery-3.1.1.min.js" type="text/javascript" ></script>
</head>
<body>
Hello World!
<div id="svg_output"/>
<script type="text/javascript">
var vrvToolkit = new verovio.toolkit();
$.ajax(
url: "Beethoven_StringQuartet_op.18_no.2.mei"
, dataType: "text"
, success: function(data)
var svg = vrvToolkit.renderData(data);
$("#svg_output").html(svg);
);
</script>
</body>
</html>
以及下面用swift编写的视图控制器文件:
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate
@IBOutlet weak var webView: WKWebView!
override func viewDidLoad()
super.viewDidLoad()
webView.uiDelegate = self
webView.navigationDelegate = self
let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "html")!
webView.loadFileURL(url, allowingReadAccessTo: url)
文件位于项目属性的“构建阶段/复制捆绑资源”下的本地文件。我也尝试将它们放在一个目录中,但没有任何成功。在项目内部的文件组织下方。
编辑:当我将 html 文件中的 url 从 Beethoven.mei
更改为 https://www.verovio.org/gh-tutorial/mei/Beethoven_StringQuartet_op.18_no.2.mei
(相同的文件,但在 Verovio 的网站上)时,一切正常!!
所以:
本地 .js 资源工作正常
问题来自 jquery 无法加载本地文本文件
知道如何让 jquery 能够加载本地文件吗?
谢谢!
M.
【问题讨论】:
【参考方案1】:根据docs,loadFileURL
这样做:
如果
readAccessURL
引用单个文件,WebKit 只能加载该文件。如果readAccessURL
引用了一个目录,那么该文件中的文件可能会被 WebKit 加载。
你得到的url
是一个文件的url,即HTML文件。您需要目录的 url。您可以致电deletingLastPathComponent
:
webView.loadFileURL(url, allowingReadAccessTo: url.deletingLastPathComponent())
【讨论】:
感谢您的回答,但问题似乎来自 jquery,请参阅我的编辑。我试过你的想法,不幸的是没有成功:)【参考方案2】:首先检查您的index.html
文件是否有 js 的 scr 路径。如果像下面这样,这意味着 js 文件包含在 js 文件夹中。所以你需要在添加到项目时添加对该文件夹的引用。
<script src="js/jquery.js"></script>
然后像下面这样获取主资源路径
let path = Bundle.main.resourcePath! + "/\(folderName)/\(fileName)"
print("path:=",path )
之后将该文件加载到 webView
do
let contents = try String(contentsOfFile: path, encoding: .utf8)
let baseUrl = URL(fileURLWithPath: path)
webView.loadHTMLString(contents as String, baseURL: baseUrl)
catch
print ("File HTML error")
【讨论】:
感谢您的回答,但问题似乎来自 jquery,请参阅我的编辑。再次感谢! @Maxime 现在你可以试试 let path = Bundle.main.resourcePath! + "/html/index.html" 我测试只是为了确保我没有遗漏任何东西,但这并不能解决问题,正如我在编辑中所解释的那样。再次感谢您【参考方案3】:您可以使用loadHTMLString
方法加载HTML,如下:
let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "html")!
do
let html = try String(contentsOf: url)
webView.loadHTMLString(html, baseURL: url.deletingLastPathComponent())
catch ....
baseURL 指向文件系统中的应用程序目录。您可以在script
标签的src
属性中写入被解释为相对于baseURL 的相对位置。
【讨论】:
以上是关于在 WKWebView (iOS, Swift) 中使用本地 Javascript 源加载本地 HTML的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 10 + Swift 3 中以编程方式在我的 WKWebView 上方添加 UILabel
swift 笔记:iOS与JavaScript的交互(三):WKWebView 1.新建WKWebView加载本地,远程页面
登录 ios swift 后从 wkwebview 获取令牌
swift [初学者来自iOS中WKWebView的简单浏览器] Chp6的青铜挑战程序设计查看Big Nerd Ranch #tags:swift3,ios,UIView,WKWebview