Приложение Phonegap не открывается после закрытия (не удалось загрузить веб-страницу с ошибкой: CDVWebViewDelegate: навигация запущена, когда состояние = 1)

Я создаю приложение для iOS с помощью Phonegap и столкнулся с некоторыми проблемами. Приложение отлично работает как на симуляторе, так и на реальном устройстве, пока я не закрою приложение, используя многозадачное отключение (последовательность двойного нажатия кнопки «Домой»..)

После повторного открытия приложения я обнаружил, что оно перестает отвечать на запросы, и вы никак не можете взаимодействовать с ним. Я потратил довольно много времени, пытаясь отладить это, и у меня не было радости.

С ошибкой я получаю сообщение об ошибке Failed to load webpage with error: CDVWebViewDelegate: Navigation started when state=1 в консоли xcode. После большого количества поисковых запросов кажется, что это вызвано хэш-тегами в URL-адресах (то, что я использую для прокрутки ссылок как на одной, так и на разных страницах). В большинстве предложений рекомендуется обновить phonegap/cordova до последней версии. Раньше у меня была версия 2.8, и я поднялся до версии 2.9, и она все еще не работала, сейчас я на версии 3, и у меня все те же проблемы.

Я проверил git Cordova и несколько раз обновлял файл CDVWebViewDelegate.m предполагаемыми исправлениями, но, похоже, ничего не работает. У меня была предыдущая версия приложения, работающая с более ранними версиями Cordova/Phonegap, но я недавно обновился, и я бы предпочел не переходить на более раннюю версию, чтобы заставить ее работать.

Я, вероятно, должен отметить, что я использую zepto для своих вызовов ajax, а не JQM, для прокрутки хэш-тегов я использую следующий код (понял, что это может помочь, учитывая, что это похоже на проблему с хэшем ..)

Функция изменения хэша

// Ajax
var wrap = $('#contentScroller .scroller')

// get href
$('a.ajax').click(function () {
    location.hash = $(this).attr('href').match(/(^.*)\./)[1]
    return false
})

// load page

function hashChange() {
    var page = location.hash.slice(1)

    if (page != "" && window.location.hash) {
        wrap.hide();
        spinner.spin(target);
        //setTimeout(function () {
            wrap.load('pages/' + page + ".html .page-wrapper")
            contentScroller.scrollTo(0,0);
            refreshScroll();
        //}, 1500);

        snapper.close();
        $(menuBtn).removeClass('active');
    }else{
        wrap.hide();
        spinner.spin(target);
        //setTimeout(function () {
            wrap.load('pages/Welcome.html .page-wrapper')
            refreshScroll();
        //}, 1500);

        snapper.close();
        $(menuBtn).removeClass('active');
    }
}

// check for hash change
if ("onhashchange" in window) {
    $(window).on('hashchange', hashChange).trigger('hashchange')
} else { // lame browser
    var lastHash = ''
    setInterval(function () {
        if (lastHash != location.hash)
            hashChange()
        lastHash = location.hash
        contentScroller.scrollTo(0,0);
    }, 100)
}

Прокрутка

$(document)
    .on('ajaxStart', function () {
        wrap.hide();
    })
    .on('ajaxStop', function () {
        //wrap.show();
    })
    .on('ajaxSuccess', function () {
        //setTimeout(function () {
            spinner.stop();
        wrap.fadeIn(700);
        refreshScroll();
    //}, 1000);


    // Local storage scrollTo
    var storage = window.localStorage;
    var url = window.location.href.substr(window.location.href.lastIndexOf("/") + 1);

    $('a.scroll-link').click(function (event) {
        event.preventDefault();
        url = url.replace('home.html?firstrun#', "");
        url = url.replace(url, url+".html");

        var myHref = $(this).attr('href');

        if (url == myHref) {
            var sameScroll = $(this).attr('data-scroll-same-page');
                sameScroll = sameScroll.replace(sameScroll, "a#" + sameScroll);

                contentScroller.scrollToElement(sameScroll, 1500);

        } else {

            var diffScroll = $(this).attr("data-scroll-diff-page");

            storage.setItem("key", diffScroll);

             //Alter value for iScroll
            var value = window.localStorage.getItem("key");
            value = value.replace(value, "a#" + value);

            location.hash = $(this).attr('href').match(/(^.*)\./)[1]
            $(window).on('hashchange', hashChange).trigger('hashchange')

            // Scroll to element after .5 second
            setTimeout(function () {
                contentScroller.scrollToElement(value, 1500);
                return false;

            }, 2000)

            // Clear local storage to prevent scrolling on page reload
            localStorage.clear();

        }

Образец ссылки

<a href="IndexOfTerms.html" class="ajax scroll-link" data-scroll-diff-page="First_year_allowance">

затем это передаст атрибут "first_year_allowance" на страницы IndexOfTerms, а затем прокрутит вниз до элемента с этим идентификатором

Может ли кто-нибудь пролить свет на то, как я могу это исправить? Это действительно начинает меня раздражать, поэтому я бы очень хотел получить исправление довольно резко!

Примечание. Используемые библиотеки: iScroll, Zepto, fastclick, snapjs, spinjs

Спасибо!


person woolm110    schedule 03.09.2013    source источник