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

如何解决 Ionic2 中的 CORS 问题和 JSONP 问题

Heroku Rails CORS 问题