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

Опитвам се да приложа заобиколното решение, предоставено от Крис, намерено тук, за да позволите на изградено от PhoneGap/Cordova приложение за Android да прави AJAX HTTPS заявки към сървър със самоподписан 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); и мога да създам приложението и пак да правя AJAX HTTP заявки, но за 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
Намерих тази публикация и тествам точно същият код в отговора на Simon, използващ 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