У меня есть приложение PhoneGap, с которым я использую AngularJS. Я использую довольно простой вызов $ 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 -->
Что мне нужно изменить? Борьба с этой ошибкой в течение нескольких выходных дней, и это немного раздражает, чтобы не создавать реальные интересные функции в свободное время.
EDIT: я обслуживаю приложение, используя phonegap serve
и тестирую ее с помощью приложения PhoneGap Developer.
Я бы предложил, чтобы ваша политика безопасности контента, возможно, понадобилась изменить, чтобы включить предложение 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")
Там некоторые ресурсы в этом онлайн:
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.