iOS11 Cordova Angular 4包装破解SecurityError:history.replaceState()

时间:2017-12-14 02:55:47

标签: angular cordova ios11.2 ios11.1.1

我有一个用cordova包裹的角度4应用程序,在iOS11.1之前工作得很好

将手机升级到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="./">

从它的外观来看,它在网址上进行字符串比较,并认为我试图访问沙盒区域之外,并阻止它

但是我需要指定一个基本的href,否则所有的链接等都将来自手机的根目录(而不是app文件夹)并中断。

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

2 个答案:

答案 0 :(得分:2)

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

我改变的是:

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

<base href="#">

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

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

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

imports: [
    ...,
    AppRoutingModule,
],

答案 1 :(得分:0)

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