AJAX-запросы к самоподписанным ресурсам HTTPS в приложениях Cordova/PhoneGap 2.1.0 для Android

Я пытаюсь реализовать обходной путь, предоставленный Крисом, найденным здесь, чтобы разрешить Android-приложению, созданному с помощью PhoneGap/Cordova, отправлять HTTPS-запросы AJAX на сервер с самозаверяющим сертификатом SSL. Я использую PhoneGap/Cordova 2.1.0, тогда как Крис использовал 1.7.0. Я могу без проблем создать класс MyWebViewClient. Однако, когда я добавляю эту строку кода...

this.setWebViewClient(this.appView, new MyWebViewClient(this));

... к переопределенному методу init() класса MainActivity я получаю эту ошибку:

Метод setWebViewClient(CordovaWebView, MyWebViewClient) не определен для типа MainActivity.

Вот мой код для MyWebViewClient.java:

package [packagename];

import android.net.http.SslError;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import org.apache.cordova.CordovaWebViewClient;
import org.apache.cordova.DroidGap;

public class MyWebViewClient extends CordovaWebViewClient {

    public class MyWebViewClient(DroidGap ctx) {
        super(ctx);
    }

    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed();
    }
}

Вот мой код для MainActivity.java:

package [packagename];

import android.os.Bundle;
import org.apache.cordova.*;

public class MainActivity extends DroidGap {

    @Override
    public void init() {
        super.init();
        this.setWebViewClient(this.appView, new MyWebViewClient(this)); // Error occurs here
    }

    @Override
    public void onCreate(bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setBooleanProperty("keeprunning", false);
        super.loadUrl("file:///android_asset/www/index.html");
    }
}

У меня недостаточно репутации, иначе я бы просто прокомментировал ответ Криса. Кроме того, я не ищу решение jQuery (я уже знаю, что могу сделать вызов $.ajax(), чтобы избежать этой проблемы, но я пытаюсь не допустить использования jQuery в своем приложении).

Любые идеи? Ваша помощь очень ценится!

Редактировать: Пожалуйста, ознакомьтесь с моими комментариями ниже, прежде чем отвечать.


person Jesse    schedule 25.10.2012    source источник
comment
Я изменил проблемную строку кода на this.webViewClient = new MyWebViewClient(this); и я могу создать приложение и по-прежнему выполнять HTTP-запросы AJAX, но для запросов AJAX HTTPS к серверу с самозаверяющим SSL-сертификатом я все равно получаю код состояния HTTP 0.   -  person Jesse    schedule 25.10.2012
comment
Я также изменил проблемную строку кода на this.appView.setWebViewClient(new MyWebViewClient(this)); но я получаю фатальное исключение, когда запускаю приложение. Вздох   -  person Jesse    schedule 25.10.2012
comment
Я нашел этот пост и протестировал точный тот же код в ответе Саймону с использованием Cordova/PhoneGap 2.1.0 также приводит к ошибке при вызове super.onPageStarted(...). Следовательно, я полагаю, что моя проблема заключается в том, что подход, который я использую, просто не работает в Cordova/PhoneGap 2.1.0. Тем не менее, я предполагаю, что должен быть способ переопределить метод onReceivedSslError(...) класса CordovaWebViewClient в Cordova/PhoneGap 2.1.0. Есть свежие идеи?   -  person Jesse    schedule 25.10.2012
comment
Кажется, что это простой ответ, но не могли бы вы попробовать super.setWebViewClient вместо этого? Изменить: только что понял, что этому вопросу уже месяц, но если у вас все еще есть проблема, мне все еще любопытно узнать, является ли это ответом.   -  person Nick Roth    schedule 30.11.2012


Ответы (1)


Это можно исправить, как показано ниже, в более поздних версиях Cordova (я использую 2.2). Как уже упоминалось, он терпит неудачу в onPageStarted() - это потому, что он ожидает appView, который имеет значение null, поэтому вы получаете исключение NullPointerException. Настройка appView, кажется, исправляет это, например

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    super.init();

    CordovaWebViewClient webViewClient = new CustomWebViewClient(this);
    webViewClient.setWebView(this.appView);
    this.appView.setWebViewClient(webViewClient);

    super.loadUrl("file:///android_asset/www/index.html");

}

Обратите внимание, что super.init() также необходим

person antonylees    schedule 30.11.2012
comment
Благодарю вас! К счастью, в последнее время цикл выпуска Cordova был коротким, и теперь я также использую версию 2.2. Очень признателен. - person Jesse; 24.12.2012