【问题标题】:Cordova / Ionic : $http request not processing while emulating or running on deviceCordova / Ionic:在设备上模拟或运行时未处理 $http 请求
【发布时间】:2015-07-31 07:29:23
【问题描述】:

上周一切顺利,当我在设备上运行应用程序或使用 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

它正确地警告“调用 api”,然后是响应(该示例的 OAuth 访问令牌)。

但是在使用时:

ionic run android

它只是提醒“调用 api”,但似乎没有处理 http 请求。

有没有人经历过类似的事情?我对此感到非常头疼。

【问题讨论】:

  • 看看这个答案是否对你有帮助:stackoverflow.com/a/29916802/4412363
  • 谢谢你,我现在试试,然后回复你。
  • 好的,这正在工作!那么你想写一个链接到这篇文章的答案我很乐意验证它。
  • 其实是重复的,但是你的问题本质上比较具体,这会导致人们在搜索这个问题时找到它,所以我将答案添加为Community Wiki
  • 对于使用cordova 6.3.0 的我,我必须修改发出网络请求的.html 文件的<meta>。如下,<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 *">。我在'self' 之后添加* 然后它工作。或者更具体一些,但我也必须具体指定协议,即https://yourdomain.com 并替换为*

标签: angularjs cordova phonegap-build ionic


【解决方案1】:

随着 Cordova 4.0.0 的更新,您将面临无法对 RESTful API 进行 HTTP 调用和加载外部资源(包括其他 HTML/视频/音频/图像)的问题。

使用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 for Android 的更新:

改进了白名单功能

  • 您需要添加新的 cordova-plugin-whitelist 插件才能继续使用白名单

  • 现在支持设置 Content-Security-Policy (CSP),并且是推荐的白名单方式(请参阅插件自述文件中的详细信息)

  • 网络请求在没有插件的情况下默认被阻止,所以安装这个插件甚至允许所有请求,即使你是 使用 CSP。

  • 这个新的白名单得到了增强,更加安全和可配置,但旧的白名单行为仍然可以通过单独的 插件(不推荐)。

注意:虽然严格来说不是此版本的一部分,但最新的默认应用 由 cordova-cli 创建的默认会包含这个插件。

【讨论】:

  • 这样开放安全性是不是有点过分了?为什么我必须启用unsafe-inlineunsafe-evals
  • 我已经修改了我的答案-我们也可以添加&lt;allow-navigation href="http://example.com/*" /&gt;,这是文档中推荐的。
  • 删除cordova-plugin-whitelist并重新添加白名单解决了我的问题,没有任何代码更改......并且白名单是相同的版本......天哪......
  • 以上都不适合我,然后我发现问题出在http apis(https apis正在工作),知道吗? stackoverflow.com/questions/58384888/…
【解决方案2】:

这是一个与网络安全相关的问题。要解决此问题,请替换 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>

【讨论】:

    【解决方案3】:

    如果你向非 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>
    

    其他选项请查看answer

    【讨论】:

      【解决方案4】:

      我在使用 ionic 应用时遇到了同样的问题。在我的情况下,Android 应用程序在我的手机上运行良好,但它没有在其他团队成员的手机上进行 http 调用。

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

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

      【讨论】:

        【解决方案5】:

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

        在 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';">
        

        【讨论】:

          猜你喜欢
          • 2019-04-19
          • 2018-08-20
          • 2019-12-16
          • 2017-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-09
          • 2023-04-03
          相关资源
          最近更新 更多