Cordova/Phonegap: ненадежный сертификат падает на navigator.app.exitApp()

Я отправил патч в плагин для ненадежных сертификатов hypery2k, который позволяет запускать его в последней версии Cordova, но я столкнулся с другой, которую я не могу понять. Для справки, проблема отслеживается здесь: https://github.com/hypery2k/cordova-certificate-plugin/issues/3

Симптомы:

Это работает, и примерно через 10 секунд приложение корректно завершает работу (это только для демонстрации):

onDeviceReady: function() {
    init();
    setTimeout(function() { navigator.app.exitApp(); }, 10000);
},

Тем не менее, это приводит к сбою и появляется сообщение "неожиданно выйти" в Android:

onDeviceReady: function() {
    init();
    cordova.plugins.certificates.trustUnsecureCerts(true);
    setTimeout(function() { navigator.app.exitApp(); }, 10000);
},

С этим в logcat:

D/CordovaActivity( 2561): onMessage(exit,null)
D/CordovaActivity( 2561): Paused the application!
W/PluginManager( 2561): THREAD WARNING: exec() call to App.exitApp blocked the main thread for 90ms. Plugin should use CordovaInterface.getThreadPool().
D/CordovaActivity( 2561): CordovaActivity.onDestroy()
D/CordovaWebView( 2561): >>> loadUrlNow()
D/CordovaWebViewClient( 2561): onPageFinished(about:blank)
D/AndroidRuntime( 2561): Shutting down VM
W/dalvikvm( 2561): threadid=1: thread exiting with uncaught exception (group=0xb0d58b20)
E/AndroidRuntime( 2561): FATAL EXCEPTION: main
E/AndroidRuntime( 2561): Process: com.mycomp.myapp, PID: 2561
E/AndroidRuntime( 2561): java.lang.NullPointerException
E/AndroidRuntime( 2561):        at org.apache.cordova.CordovaWebViewClient.onPageFinished(CordovaWebViewClient.java:215)
E/AndroidRuntime( 2561):        at com.android.webview.chromium.WebViewContentsClientAdapter.onPageFinished(WebViewContentsClientAdapter.java:449)
E/AndroidRuntime( 2561):        at com.android.org.chromium.android_webview.AwContentsClient$AwWebContentsObserver$1.run(AwContentsClient.java:73)
E/AndroidRuntime( 2561):        at android.os.Handler.handleCallback(Handler.java:733)
E/AndroidRuntime( 2561):        at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime( 2561):        at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime( 2561):        at android.app.ActivityThread.main(ActivityThread.java:5017)
E/AndroidRuntime( 2561):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2561):        at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime( 2561):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
E/AndroidRuntime( 2561):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
E/AndroidRuntime( 2561):        at dalvik.system.NativeStart.main(Native Method)
I/Process ( 2561): Sending signal. PID: 2561 SIG: 9
I/ActivityManager( 1276): Process com.mycomp.myapp (pid 2561) has died.

Все остальное работает нормально, оно просто вылетает при попытке реализовать код для выхода из приложения, например, при нажатии кнопки "Назад".

Это основной блок кода, который запускается из плагина при вызове вышеупомянутой функции trustUnsecureCerts:

@Override
public boolean execute(String action, JSONArray args,
        CallbackContext callbackContext) throws JSONException {

    if (action.equals("setUntrusted")) {
            allowUntrusted = args.getBoolean(0);
            Log.d(LOG_TAG, "Setting allowUntrusted to " + allowUntrusted);
            cordova.getActivity().runOnUiThread(new Runnable() {
                    public void run() {
                            CertificatesCordovaWebViewClient cWebClient = new CertificatesCordovaWebViewClient(cordova);
                            cWebClient.setAllowUntrusted(allowUntrusted);
                            webView.setWebViewClient(cWebClient);
                            CordovaActivity ca = (CordovaActivity) cordova.getActivity();
                            ca.clearCache();
                    }
            });
            callbackContext.success();
            return true;
    }
    callbackContext.error("Invalid Command");
    return false;
}

И если это поможет увидеть полное определение класса, два полных исходных файла можно найти здесь: https://github.com/hypery2k/cordova-certificate-plugin/tree/master/src/android/de/martinreinhardt/cordova/plugins

Есть идеи? Благодарю.

0 ответов

Другие вопросы по тегам