Cordova/Ionic:$http 请求在模拟时未处理或在设备上 运行

Cordova / Ionic : $http request not processing while emulating or running on device

上周一切顺利,当我 运行 设备上的应用程序或使用 Genymotion 进行仿真时,对 api 的所有调用都在工作(返回数据或失败但在至少显示一些东西)。

我正在使用

ionic run android

我添加更新全局 cordova ionic:

npm install -g cordova ionic

因为所有 $http 请求甚至都没有处理。当 Api 仍然工作正常且 CORS 已完美设置时,我无法得到任何响应。

我发现的唯一方法是使用选项 --livereload 或 -l :

ionic run -l android

我想不惜一切代价避免使用 livereload。

我开始使用 ionic 1.0.0 和 cordova lib 4.3.0 从头开始​​创建项目。

angular.module('starter.controllers', [])

.controller('AppCtrl', function($scope, $ionicModal, $timeout, $http) {

  alert('calling api');
  // Create an anonymous access_token
  $http
      .get(domain+'/oauth/v2/token?client_id='+public_id+'&client_secret='+secret+'&grant_type=client_credentials')
      .then(function(response){
          alert(response.data.access_token);
      });
})

因此在使用时:

ionic serve

它正确地警告 'calling api' 然后是响应(该示例的 OAuth 访问令牌)。

但是在使用时:

ionic run android

它只是在提醒 'calling api' 但似乎没有处理 http 请求。

有没有人经历过类似的事情?我对此很头疼。

随着 Cordova 4.0.0 的更新,您将面临无法对 RESTful API 进行 HTTP 调用和加载外部资源的问题,其中包括其他 HTMLs/video/audio/images.

使用 cordova-plugin-whitelist 将域列入白名单解决了问题。

删除白名单插件(如果已安装):

cordova plugin remove cordova-plugin-whitelist

通过 CLI 添加白名单插件:

cordova plugin add cordova-plugin-whitelist

然后将以下代码行添加到应用程序的 config.xml 中,它位于应用程序的根目录中:

文档中推荐

<allow-navigation href="http://example.com/*" />

或:

<allow-navigation href="http://*/*" />

你的 index.html

中的这个 meta 标签
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"/>

出现此问题的原因:

来自 Cordova 4.0.0 的 Android 更新:

Whitelist functionality is revamped

  • You will need to add the new cordova-plugin-whitelist plugin to continue using a whitelist

  • Setting a Content-Security-Policy (CSP) is now supported and is the recommended way to whitelist (see details in plugin readme)

  • Network requests are blocked by default without the plugin, so install this plugin even to allow all requests, and even if you are using CSP.

  • This new whitelist is enhanced to be more secure and configurable, but the Legacy whitelist behaviour is still available via a separate plugin (not recommended).

Note: while not strictly part of this release, the latest default app created by cordova-cli will include this plugin by default.

当我尝试以下操作时,它对我有用……

在 Config.xml 中,允许访问和导航到您的域:

<access origin="http://yourdomain1.com" />
<allow-navigation href="http://yourdomain1.com"/>

然后在index.html中添加Content-Security-Policy如下:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' http://yourdomain1.com  data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline';  media-src *;  script-src 'self' 'unsafe-eval' 'unsafe-inline';">

我在使用 ionic 应用程序时遇到了同样的问题。就我而言,android 应用程序在我的手机上 运行 正常,但它无法在其他团队成员的移动设备上进行 http 调用。

使用 chrome://inspect#devices 调试设备后。我开始知道确切的错误。 在 HTTP 调用期间,应用出现 ERR_CLEARTEXT_NOT_PERMITTED 错误。

我在下面使用 link 允许以明文格式在我的围栏中的 AndroidManifest.xml 文件中发送数据。 https://forum.ionicframework.com/t/err-cleartext-not-permitted-in-debug-app-on-android/164101

如果您向非 https url 发送 http 请求,请确保您已添加

android:usesCleartextTraffic="true"

在AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

对于其他选项,请检查此

这是一个与网络安全相关的问题。要解决此问题,请替换 resource/android/xml/network_security_config.xml

有,

<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain>api.mydomain.in</domain>
    </domain-config>
</network-security-config>