我有一个我使用AngularJS的PhoneGap应用程序。我正在使用一个非常简单的$ http调用我的Node后端:
$http.get("http://localhost:6969/random")
.then(function(response) {
$scope.images = response.data;
});
无论如何,PhoneGap都没有打到后端。我在普通的浏览器中对它进行了测试,它按预期工作。
我显然已经阅读了很多关于它的内容,并且大多数人都使用白名单来修复它,但在我的config.xml
中,我的白名单尽可能开放:
<plugin name="cordova-plugin-whitelist" source="npm" spec="1.1.0" />
<allow-navigation href="*" subdomains="true" />
<allow-intent href="*" subdomains="true"/>
<access origin="*" subdomains="true"/> <!-- Required for iOS9 -->
我需要改变什么?几天来一直在捣乱这个bug,而且在我的空闲时间里无法真正创建新的酷炫功能有点烦人。
编辑:我正在使用phonegap serve
为该应用提供服务,并使用PhoneGap开发者应用进行测试。
答案 0 :(得分:1)
我建议您的内容安全策略可能需要修改为包含一个connect-src子句来指定Ajax请求的位置。
获取您在评论中发布的CSP元标记:
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src: 'self' 'unsafe-inline' 'unsafe-eval'" />
我建议修改此问题以向任何地方开放Ajax请求,看看是否有帮助,然后将其统治到您想要支持的域之后。
建议的CSP将是:
<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 *; connect-src *">
如果可行并且您希望稍后锁定到一个域,则需要以下内容:
<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 *; connect-src http://api.mydomain.com">
此外,我认为您需要更改应用程序的代码以通过主机名或IP地址连接到您的服务器,因此在设备上它不会将“localhost”与设备本身混淆并尝试建立连接设备上的端口6969。
所以:
$http.get("http://localhost:6969/random")
可能需要成为:
$http.get("http://myhost.mydomain.com:6969/random")
或者
$http.get("http://xxx.xxx.xxx.xxx:6969/random")
网上有一些资源: