CORS 和 phonegap 应用程序
Posted
技术标签:
【中文标题】CORS 和 phonegap 应用程序【英文标题】:CORS and phonegap apps 【发布时间】:2014-02-13 08:26:10 【问题描述】:phonegap 应用程序是否需要任何 CORS 更改(例如设置 Access-Control-Allow-Origin:*)才能工作?我在 Heroku 上托管了一个 RESTful API,我想知道是否需要设置此标头才能让我的 phonegap 应用程序调用该服务?
我在想,因为 phonegap 应用程序并没有真正托管在域上,所以不需要 CORS,我不会遇到任何跨域问题?
如果有人可以向我解释为什么会这样或不是这样,那就太好了。
【问题讨论】:
【参考方案1】:PhoneGap 你可以直接 XHR 到远程服务器和它 应该“正常工作”。跨域策略不适用于 PhoneGap (出于各种原因,基本上是因为您的应用程序本质上是 运行设备上的 file:// URI)。
请注意,您必须为您的应用设置白名单 访问这些外部域。请检查此链接:
http://docs.phonegap.com/en/1.8.0rc1/guide_whitelist_index.md.html#Domain%20Whitelist%20Guide
【讨论】:
请记住,此白名单不适用于通过 inAppBrowser-Plugin 完成的内容。白名单仅适用于 Cordova 主 web 视图! 我想知道为什么 this answer 说“通过 file:// 运行的脚本对 CORS 的支持有限”,如果 XHR 到远程服务器应该“正常工作”。 感谢这篇文章,这是我要分享的结论。它真的会“正常工作”。但是如果在服务器上启用了 CORS,它将不起作用,因为您不能将“file://”设置为允许的来源。【参考方案2】:默认的 Cordova (PhoneGap) 平台都不需要 CORS,尽管 HTML 文件托管在本地 (file://
) 并且正在访问 Web 域。
但是,在 ios 上,如果您通过 cordova-plugin-wkwebview-engine 从 UIWebView
切换到较新的 WKWebView
,则确实必须实施 CORS。
【讨论】:
请注意,“浏览器”平台确实需要 CORS。不确定是否有其他人这样做。 @Jules:与其他平台不同,browser
不依赖于任何特定的 Web 视图,因此它仅取决于您选择使用的 Web 浏览器。假设您正在谈论开发用途,在 Chrome 中使用 --disable-web-security
flag 禁用同源策略并避免实施 CORS 是微不足道的。
这个“所有默认的 Cordova (PhoneGap) 平台都不需要 CORS”在 2018 年 8 月仍然有效吗?在我们与客户的 LOGIN 集成期间,移动应用程序收到 401 并且详细信息显示“CORS”错误。服务器团队说他们在网关上启用了 CORS,但相信来源“file://”是根本原因。帮助:(
@mobibob:据我所知,这仍然是正确的。无论如何,最好的办法是发布一个新问题,指出平台并包括完整的请求和响应标头。
cordova 插件添加 cordova-plugin-wkwebview-file-xhr【参考方案3】:
是的,您必须在托管您的 API 的服务器上激活 CORS。 我在 iOs 上运行 Phonegap 应用程序。我的应用程序从 Apache 上的服务器 API 请求 json。 我在服务器上激活 CORS 以获取数据,否则我的应用程序中什么也得不到,没有错误也没有数据。
请注意,配置文件中的访问参数允许您过滤您的应用程序有权查询的域,但对服务器的权限没有任何作用。
【讨论】:
【参考方案4】:从cordova 5开始,您需要添加白名单插件
https://github.com/apache/cordova-plugin-whitelist
在 config.xml 中添加
<!-- Don't block any requests -->
<access origin="*" />
【讨论】:
在 windows 手机上仍然存在 CORS 问题以上是关于CORS 和 phonegap 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
Rails、Backbone、PhoneGap、CORS(Access-Control-Allow-Origin 错误不允许)
使用自签名证书通过 HTTPS 进行 CORS 请求的 Phonegap 应用程序
在 PhoneGap+jQuery Mobile 中使用 ajax 的 CORS 无法在设备上运行,但在浏览器上运行
在 Heroku 上的 Django 应用程序中为 CORS 指定 URL