SecurityError(DOM Exception 18):阻止尝试在Angular 5中使用history.replaceState()...

时间:2018-02-03 00:18:55

标签: ios swift

问题

我收到以下错误:

  

[错误]错误 - 错误:未捕获(在承诺中):SecurityError(DOM异常18):阻止尝试使用history.replaceState()从file:/// Users // Library / Developer /更改会话历史记录URL CoreSimulator / Devices // data / Containers / Bundle / Application // ios-shell.app / public / index.html to file:/// Users // Library / Developer / CoreSimulator / Devices // data / Containers / Bundle / Application //ios-shell.app/public/#/。路径和片段必须与沙盒文档匹配。

两个网址之间的差异只是结束public/index.html - > public/#/

有一个similar question asked here on StackOverflow但这是file:///file://之间的问题

实施

这是一个自定义iOS应用程序,用于运行没有cordova的HTML SPA应用程序。目前使用WKWebView

在iOS 11.2上的iPhone 8设备上运行模拟器

Web应用程序是使用{hash: true}作为路由策略的Angular 5应用程序。

的ViewController

class ViewController: UIViewController {
    var serenity: Serenity?

    override func viewDidLoad() {
        super.viewDidLoad()
        serenity = Serenity(self)
        serenity?.load("index")
    }

    ...
}

Serenity.swift

class Serenity: WKWebView, WKScriptMessageHandler{

    var controller: ViewController?
    let config = WKWebViewConfiguration()
    var commands = Dictionary<String, (_ args: Any?) -> Any?>()

    init(_ controller: ViewController){
        self.controller = controller
        config.userContentController.addUserScript(WKUserScript(source: "window.NATIVE_DEVICE=true;", injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: false))
        super.init(frame: controller.view.frame, configuration: config)
    }

    func load(_ file: String) {
        if let html = Bundle.main.path(forResource: file, ofType: "html", inDirectory: "public"){
            let url = URL(fileURLWithPath: html)
            let request = URLRequest(url: url)
            super.load(request)
            controller?.view.addSubview(self)
        }
    }

    ...
}

问题

有没有办法将index.html文件加载为public/,这样当角度接管并开始路由时,它不会导致此错误?

任何其他建议也会有所帮助

1 个答案:

答案 0 :(得分:2)

解决方案

我修改了我的index.html文件,使其基数为<base href="index.html">而不是<base href=".">,强制角度使用.../index.html/#/而不是.../#/等路线。

非解决方案(针对未来的搜索者)

我尝试加载目录并允许WKWebView默认加载index.html页面

if let html = Bundle.main.path(forResource: file, ofType: "html", inDirectory: "public"){
    let url = URL(fileURLWithPath: html)
    let request = URLRequest(url: url).deletingLastPathComponent()
    super.load(request)
    controller?.view.addSubview(self)
}

然而,这导致WKWebView根本没有加载页面。