【问题标题】:PhoneGap doesn't want to use REST service no matter what I do无论我做什么,PhoneGap 都不想使用 REST 服务
【发布时间】:2016-04-20 00:01:38
【问题描述】:

我有一个 PhoneGap 应用程序,我正在使用 AngularJS。我正在对我的 Node 后端使用一个非常简单的 $http 调用:

$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 -->

我需要改变什么?断断续续地与这个错误作斗争了几天,在我的空闲时间无法真正创建新的酷功能有点烦人。

编辑:我正在使用 phonegap serve 为应用提供服务,并使用 PhoneGap 开发者应用对其进行测试。

【问题讨论】:

  • 你安装了白名单插件吗? cordova plugin -l 返回什么?
  • 是的,我只是尝试重新安装它以确保它显示client git:(master) ✗ cordova plugin add cordova-plugin-whitelist Plugin "cordova-plugin-whitelist" already installed on android. Plugin "cordova-plugin-whitelist" already installed on browser.
  • 对不起@user1027620 这里是cordova plugin -l的输出:cordova-plugin-whitelist 1.2.2-dev "Whitelist"
  • @user1027620 为清楚起见,在帖子底部添加了更多信息
  • 这个问题只影响安卓吗?

标签: angularjs cordova phonegap-cli


【解决方案1】:

我建议您的内容安全策略可能需要修改以包含一个 connect-src 子句来指定 Ajax 请求可以到达的位置。

获取您在 cmets 中发布的 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")

网上有一些资源:

【讨论】:

  • 第一次尝试并没有太大变化。我正在阅读您的博文,希望对您有所帮助。 PhoneGap 开发者应用程序是否存在不尊重我的 config.xml 或 标记中的更改的更改?
  • 您是否尝试过在设备/模拟器上进行真实部署?不幸的是,我对PhoneGap Developer App的来龙去脉并不熟悉。
  • 我还没有,因为我在这一点上或多或少地进行原型设计,但似乎我将不得不开始在模拟器而不是这个应用程序上进行测试。我会回到这里并更新我的发现。感谢您迄今为止的帮助!
  • 从我的博客文章中注意这里的 cmets 较新版本的 Cordova 不需要您在 iOS 上的 .plist 中管理非 SSL 后端,因为 CLI 会为您执行此操作,尽管您仍然需要在所有情况下都获得正确的内容安全政策。
  • 您可能还想尝试使用后端的 IP 地址而不是 localhost,以确保它正确解析,并且 PhoneGap 应用程序不会尝试向 localhost 作为电话本身发出请求。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2012-07-07
  • 2012-03-11
  • 2016-04-17
相关资源
最近更新 更多