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