jQuery Post не работает в Cordova из приложения для Android - PullRequest
0 голосов
/ 15 октября 2019

Я использую Cordova 9.0.1:

[luis@luis myapp]$ cordova -v
9.0.0 (cordova-lib@9.0.1)

Я не могу решить эту проблему. Всякий раз, когда я пытаюсь войти в приложение Android с простым запросом jQuery Post на наш сервер, он вводит метод fail (). Запрос не регистрируется в журнале доступа Apache, поэтому он никогда не достигает сервера.

Однако, если я запускаю Cordova и пытаюсь запустить браузер, вход в систему успешен.

Этомой файл config.xml:

<?xml version='1.0' encoding='utf-8'?>
<widget id="io.cordova.experienceerp" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>MyAPP</name>
    <description>
        Description
    </description>
    <author email="info@mycompany.com" href="http://mycompany.com">
        My company
    </author>
    <content src="index.html" />
    <access origin="*" />
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <allow-intent href="tel:*" />
    <allow-intent href="sms:*" />
    <allow-intent href="mailto:*" />
    <allow-intent href="geo:*" />
    <platform name="android">
        <allow-intent href="market:*" />
        <icon density="ldpi" src="res/icon/android/icon-36-ldpi.png" />
        <icon density="mdpi" src="res/icon/android/icon-48-mdpi.png" />
        <icon density="hdpi" src="res/icon/android/icon-72-hdpi.png" />
        <icon density="xhdpi" src="res/icon/android/icon-96-xhdpi.png" />
        <splash density="port-hdpi" src="res/screen/android/drawable-port-hdpi-screen.png" />
        <splash density="port-ldpi" src="res/screen/android/drawable-port-ldpi-screen.png" />
        <splash density="port-mdpi" src="res/screen/android/drawable-port-mdpi-screen.png" />
        <splash density="port-xhdpi" src="res/screen/android/drawable-port-xhdpi-screen.png" />
    </platform>
    <platform name="ios">
        <allow-intent href="itms:*" />
        <allow-intent href="itms-apps:*" />
        <icon height="57" src="res/icon/ios/icon-57.png" width="57" />
        <icon height="114" src="res/icon/ios/icon-57-2x.png" width="114" />
        <icon height="72" src="res/icon/ios/icon-72.png" width="72" />
        <icon height="144" src="res/icon/ios/icon-72-2x.png" width="144" />
        <splash height="1024" src="res/screen/ios/screen-ipad-portrait.png" width="768" />
        <splash height="2048" src="res/screen/ios/screen-ipad-portrait-2x.png" width="1536" />
        <splash height="480" src="res/screen/ios/screen-iphone-portrait.png" width="320" />
        <splash height="960" src="res/screen/ios/screen-iphone-portrait-2x.png" width="640" />
        <splash height="1136" src="res/screen/ios/screen-iphone-portrait-568h-2x.png" width="640" />
    </platform>
    <preference name="Orientation" value="portrait" />
    <preference name="AutoHideSplashScreen" value="true" />
    <preference name="SplashScreenDelay" value="3000" />
    <preference name="SplashMaintainAspectRatio" value="true" />
    <preference name="SplashShowOnlyFirstTime" value="false" />
    <preference name="AndroidPersistentFileLocation" value="Compatibility" />
    <!--
    <plugin name="com.hutchind.cordova.plugins.streamingmedia" spec="~0.1.4" />
-->
    <plugin name="uk.co.workingedge.phonegap.plugin.launchnavigator" spec="^4.1.3" />
    <plugin name="cordova-plugin-camera" spec="^4.0.3" />
    <plugin name="cordova-plugin-tts" spec="^0.2.3" />
    <plugin name="cordova-plugin-badge" spec="^0.8.7" />
    <plugin name="cordova-plugin-whitelist" spec="^1.3.3" />
    <plugin name="cordova-plugin-vibration" spec="^3.1.0" />
    <plugin name="cordova-plugin-splashscreen" spec="^5.0.2" />
    <plugin name="cordova-plugin-network-information" spec="^2.0.1" />
    <plugin name="cordova-plugin-media-capture" spec="^3.0.2" />
    <plugin name="cordova-plugin-media" spec="^5.0.2" />
    <plugin name="cordova-plugin-local-notification" spec="^0.9.0-beta.2" />
    <plugin name="cordova-plugin-inappbrowser" spec="^3.0.0" />
    <plugin name="cordova-plugin-file" spec="^6.0.1" />
    <plugin name="cordova-plugin-dialogs" spec="^2.0.1" />
    <plugin name="cordova-plugin-device" spec="^2.0.2" />
    <plugin name="cordova-plugin-blob-constructor-polyfill" spec="^1.0.2" />
    <plugin name="cordova-plugin-app-event" spec="^1.2.1" />
    <plugin name="cordova-plugin-advanced-http" spec="^2.0.1" />
    <plugin name="cordova-plugin-actionsheet" spec="^2.3.3" />
    <plugin name="cordova-plugin-file-transfer" spec="^1.7.1" />
    <plugin name="cordova-plugin-geolocation" spec="^4.0.1" />
    <plugin name="cordova-plugin-mauron85-background-geolocation" spec="^3.0.0-alpha.47">
        <variable name="GOOGLE_PLAY_SERVICES_VERSION" value="11+" />
        <variable name="ANDROID_SUPPORT_LIBRARY_VERSION" value="26+" />
        <variable name="ICON" value="@mipmap/icon" />
        <variable name="SMALL_ICON" value="@mipmap/icon" />
        <variable name="ACCOUNT_NAME" value="@string/app_name" />
        <variable name="ACCOUNT_LABEL" value="@string/app_name" />
        <variable name="ACCOUNT_TYPE" value="$PACKAGE_NAME.account" />
        <variable name="CONTENT_AUTHORITY" value="$PACKAGE_NAME" />
    </plugin>
    <engine name="browser" spec="^5.0.4" />
    <engine name="ios" spec="^4.5.5" />
    <engine name="cordova-android" version=">=1.8.0" />
</widget>

Как вы можете проверить, в нем есть теги для междоменного доступа:

<access origin="*" />
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <allow-intent href="tel:*" />
    <allow-intent href="sms:*" />
    <allow-intent href="mailto:*" />
    <allow-intent href="geo:*" />

Я даже добавил этот тег в свою точку входа вapp, index.html:

<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 *">

Я видел это как решение где-то еще, но оно все еще не работает.

Это кусок кодакоторый терпит неудачу. В консоли приложения не отображается сообщение об ошибке (я тестирую его с подключенным к компьютеру устройством, чтобы я мог проверить консоль):

console.log('Post to ' + url + ' user:' + data.user + ' password:' + data.password); // both the URL and the data are correct
$.post(url, data, function(res) {
    // This code is not reached
    if (res.id !== undefined && res.token) {
        console.log('Login OK');
        // store user data...
        return;
    }
    if (res.error) {
        // alert the validation error
        return;
    }
    alert('Unexpected server error');
}).fail(function(jqXHR, textStatus, errorThrown) {
    console.log('Login error: ' + textStatus + ' ' + errorThrown);
    // show error in login form...
});

Ошибка, отображаемая в консоли: Ошибка входа: ошибка Не найдено

Не могли бы вы мне помочь? Я застрял, и больше ничего не приходит на ум, и я сделал все, что нашел.

1 Ответ

0 голосов
/ 25 октября 2019

Я нашел решение:

Начиная с Cordova 9, API Level 28, все устройства с Android 9 или более поздней версии вынуждены отправлять https-запросы вместо http, что всегда приводит к сбою, если не указано в конфигурации исключений. , как указано здесь:

Конфигурация безопасности

Подробнее здесь

...