iOS11 Cordova Angular 4 wrap breaking SecurityError: history.replaceState()

iOS11 Cordova Angular 4 wrap breaking SecurityError: history.replaceState()

我有一个用 cordova 封装的 angular 4 应用程序,它在 iOS11.1

之前运行良好

正在将 phone 升级到 iOS11。1 我现在收到错误消息
Error: Uncaught (in promise): SecurityError (DOM Exception 18): Blocked attempt to use history.replaceState() to change session history URL from file:///var/containers/Bundle/Application/CE4A6135-633D-49B9-9A1D-28CBFF5AB832/MyAppName.app/www/index.html to file:///var/containers/Bundle/Application/CE4A6135-633D-49B9-9A1D-28CBFF5AB832/MyAppName.app/www/. Paths and fragments must match for a sandboxed document. replaceState@[native code] replaceState@file:///var/containers/Bundle/Application/CE4A6135-633D-49B9-9A1D-28CBFF5AB832/Real%20Yeti.app/www/

我的基础标签如下<base href="./">

从外观上看,它在 url 上进行了字符串比较,并认为我正在尝试访问沙盒区域之外的内容,并阻止了它

但是我确实需要指定一个基本 href,否则所有链接等都将基于 phone 的根目录(而不是应用程序文件夹)并中断。

有人知道如何解决这个问题吗?
(问题存在于 iOS11.1.1,iOS11.2)

如果我正确理解 WebKit 的源代码 (source for that error),它会发生在您拥有的文件 URI 上。我发现的唯一解决方法是使用本地服务器,使其成为 localhost:XXX 中的 运行,这确实允许替换 URL

我已经使用 HashLocationStrategy 解决了这个问题。
这将通过 /#/ 加载 url 而不会触发错误。

我修改的是:

在 index.html 中将基本 href 设置为 #

<base href="#">

在 app-routing.module.ts 添加了 useHash 选项

RouterModule.forRoot( routes, { useHash: true } ),

在 app.module.ts 中确保 RoutingModule 是导入数组中的最后一个

imports: [
    ...,
    AppRoutingModule,
],