WKWebView не выполняет какой-либо js-код

Я визуализирую локальный файл index.html внутри своего проекта Xcode, используя WKWebView. Дело в том, что код html и css внутри файла успешно отображается внутри webView, но javaScript, однако, не отображается вообще.

Я искал похожие вопросы по этой проблеме в stackoverflow, и я пришел к выводу, что Apple не выполняет js в локальном html-файле, и для выполнения js мне необходимо использовать локальный веб-сервер с GCDWebServer.

Честно говоря, я новичок в концепции дырочного веб-сервера, и мне трудно понять, как запустить html на локальном веб-сервере и как это сделать с GCDWebServer.

Какой простой способ запустить мой файл index.html на локальном сервере внутри WKWebView и как это сделать?

вот мой код:

override func viewDidLoad() {
    super.viewDidLoad()

    let resourceUrl = Bundle.main.url(forResource: "index", withExtension: "html")
    let urlRequest = URLRequest.init(url: resourceUrl!)
    webView.load(urlRequest)

    webView.allowsBackForwardNavigationGestures = true

}

person Hudi Ilfeld    schedule 08.03.2018    source источник
comment
Возможно, вы захотите взглянуть на WKUserContentController и WKUserScript. Я использовал их для внедрения Javascript на веб-страницу, но вам нужно отделить код js от html и загрузить его из пакета.   -  person Fabio Felici    schedule 08.03.2018
comment
не через <script src="file.js"></script>?   -  person Hudi Ilfeld    schedule 08.03.2018


Ответы (1)


Вот как мне удалось создать GCDWebServer локальный сервер с успешным рендерингом js-файлов с html тегами скрипта и с отсутствием необходимости в JS-инъекциях, таких как WkUserscript или evaluateJavaScript

мой код:

import UIKit
import WebKit
import GCDWebServer

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate{


var wkWebView: WKWebView!
var webServer = GCDWebServer()

var contentController = WKUserContentController()


func initWebServer() {
    let folderPath = Bundle.main.path(forResource: "www", ofType: nil)

    webServer.addGETHandler(forBasePath: "/", directoryPath: folderPath!, indexFilename: "index.html", cacheAge: 0, allowRangeRequests: true)

    webServer.start(withPort: 8080, bonjourName: "GCD Web Server")

}

public override func viewDidLoad() {
    super.viewDidLoad()

    initWebServer()

    let config = WKWebViewConfiguration()
    config.userContentController = contentController


    wkWebView = WKWebView(frame: view.bounds, configuration: config)
    wkWebView.scrollView.bounces = false
    wkWebView.uiDelegate = self
    wkWebView.navigationDelegate = self
    view.addSubview(wkWebView!)

    wkWebView.load(URLRequest(url: webServer.serverURL!))
}

}
person Hudi Ilfeld    schedule 19.03.2018