内容简介:过去的几个月里,我们一直在开发一个混合应用。前端框架使用的是 Angular,但是在某些 Android 机型上运行的时候,报了以下的错误:错误的主要原因是:随后找到了官方文档中的 issue:
过去的几个月里,我们一直在开发一个混合应用。前端框架使用的是 Angular,但是在某些 Android 机型上运行的时候,报了以下的错误:
main.aca1d67….bundle.js:1235 EXCEPTION: Uncaught (in promise): SecurityError: Failed to execute 'replaceState' on 'History': A history state object with URL 'file:///#/' cannot be created in a document with origin 'file://' and URL 'file:///android_asset/www/index.html'.t.handleError @
错误的主要原因是: History API 在某些 Chrome 内核的 WebView 上不支持 file:// 协议 。据不完成测试统计,版本在 45~49 之间,都有这个问题。
随后找到了官方文档中的 issue: Cannot run angular 2+ from file:/// - looks like 'base href="/"' is the issue
官方 issue 中的一个高赞答案,一共两步,并是不 work。
1.将 Router 配置为 Hash
CommonModule,RouterModule.forRoot(routes,{useHash:true})
2.修改 base href:
<script>document.write('<base href="' + document.location + '" />');</script>
于是乎,这时我们有两个选择:
- 重写 HashLocationStrategy,如下 issue 12341 所说: The router HashLocationStrategy should not use the History API
- 使用 HTTP 服务器来运行本地的 WebView 资源文件。
方式一,面对的主要挑战是,不只 Angular 使用 History API 来处理 hash 路由,其它框架也使用了相似的东西,如 React Router、Vue Router。
方式二,面对的主要问题是,我们需要在 Android 设备上启动一个 HTTP 服务器,并能让它支持跨域请求和访问本地文件。
在这个过程中,想到了 Ionic 框架也是使用 Angular 来编写的。于是,先运行了个官方的 Hello, world,发现它是运行在 http://localhost:8100
上的。
紧接着,复制了官方的 WebView 插件代码: Ionic Web View for Cordova 。随之,我们就遇到了跨域的问题,原因是这些请求都是通过 WebView 发出去。
而这个问题,又近乎无解,我们无法获取 WebView post 请求中的参数。于是乎,我们只能通过插件来向 WebView 提供一个跨域请求的能力: Cordova Advanced HTTP 。
以上所述就是小编给大家介绍的《混合应用:从 file 协议到本地 HTTP 服务器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript修炼之道
波顿纽威 / 巩朋、张铁 / 人民邮电 / 2011-11 / 29.00元
《JavaScript修炼之道》是JavaScript的实战秘籍。作者将自己多年的编程经验融入其中,不仅可以作为学习之用,更是日常JavaScript开发中不可多得的参考手册,使读者少走很多弯路。《JavaScript修炼之道》的内容涵盖了当今流行的JavaScript库的运行机制,也提供了许多应用案例。《JavaScript修炼之道》针对各任务采取对页式编排,在对各任务的讲解中,左页解释了任务的......一起来看看 《JavaScript修炼之道》 这本书的介绍吧!