升级到 Cordova 5.0 + cordova-android@4.0 后 Ajax 请求失败
Posted
技术标签:
【中文标题】升级到 Cordova 5.0 + cordova-android@4.0 后 Ajax 请求失败【英文标题】:Ajax requests fail after upgrading to Cordova 5.0 + cordova-android@4.0 【发布时间】:2015-05-05 18:25:20 【问题描述】:我最近升级到了 Cordova 5.0(和 Cordova android 4.0),从那以后,我的应用无法再访问外部资源。
我在 config.xml 中仍然有 <access origin="*" />
(和以前一样),我在 AndroidManifest.xml 中仍然有 <uses-permission android:name="android.permission.INTERNET" />
(和以前一样),但是 ajax 调用被拒绝而没有任何解释(“textStatus”参数是“ error”,“errorThrown”参数为空,xhr.state() 返回“rejected”)。
我已经验证没有请求到达服务器,所以它似乎被 Android 停止了,但是日志没有给出任何解释为什么......
我可以从 Android 浏览器访问相关 URL,但不能从应用程序访问。
ajax 请求是通过调用Backbone.js 的Backbone.sync() 发出的,最终调用jquery 的$.ajax()。我没有改变任何关于如何拨打电话...只是升级了cordova。
在 Cordova 5.0 中是否有新的网络请求要求/设置,或者我需要做的与以前的 Cordova 版本不同的事情?
有没有人知道我可以通过什么方式获得有关 Android 和/或 Cordova 拒绝请求的原因的更多信息?
【问题讨论】:
【参考方案1】:我追踪到了 android@4.0.0 cordova 平台的罪魁祸首。它现在需要新的cordova-plugin-whitelist 插件。
可以安装
cordova plugin add cordova-plugin-whitelist
或添加
<plugin name="cordova-plugin-whitelist" spec="1" />
到config.xml,然后配置
<allow-navigation href="*" />
代替旧的<access origin="*" />
标签。
当这样的问题出现时,日志不再显示“白名单拒绝”错误消息,这有点烦人(这本来可以为我节省很多时间),但也许以后会出现。
【讨论】:
非常感谢。拯救了我的一天。 这仅在我重新创建模拟器时才对我有用 谢谢。像魅力一样工作。在 Cordova 5.3.3 上测试,没有更改任何代码。 这个答案不完整。如果这对您不起作用,请阅读IF External links do not open 那么摆脱访问来源?【参考方案2】:在 Cordova 6.X 中,您需要删除内置的白名单插件并重新安装新版本的插件。
cordova plugin remove cordova-plugin-whitelist
然后重新安装插件
cordova plugin add cordova-plugin-whitelist
然后将<allow-navigation href="*" />
替换为config.xml文件而不是<access origin="*" />
就我而言,这个技巧奏效了。
【讨论】:
【参考方案3】:两件事
确保您使用的 ajax url 允许跨源请求 您是否在进行跨源请求时传递了相关标头
阅读
http://enable-cors.org/
How to enable CORS in AngularJs
http://backbonetutorials.com/cross-domain-sessions/
【讨论】:
【参考方案4】:如果你使用的是cordova 6.x.x,你需要卸载内置的cordova-plugin-whitelist
cordova 插件删除 cordova-plugin-whitelist
并使用
重新安装它cordova插件添加cordova-plugin-whitelist
即使问题仍然存在,请重新启动命令提示符并尝试。
【讨论】:
【参考方案5】:对我来说,在我从 html 文件的 mata 标记中删除后,它就开始工作了:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
【讨论】:
以上是关于升级到 Cordova 5.0 + cordova-android@4.0 后 Ajax 请求失败的主要内容,如果未能解决你的问题,请参考以下文章
Cordova 3.5 deviceready 事件在 5 秒后未触发
Cordova“hidekeyboard”事件在 Cordova 5.0 中不起作用
将 cordova 1.9.0 (iOS) 升级到 cordova 2.1.0 并更新现有项目以使用 2.1.0