Сбой запроса Fetch () в сервисном работнике, работающем через Android Webview - PullRequest
1 голос
/ 23 июня 2019

У меня есть сервисный работник, который я использую для включения автономной версии моего сайта. Это прекрасно работает. У меня также есть приложение для Android, которое по сути является просто оболочкой для веб-просмотра, загружающего мой сайт.

Все было в порядке и до тех пор, пока 2-3 недели назад запрос Fetch () не начал работать сразу же. Это происходит только при запуске через веб-просмотр Android. Запуск через браузер работает нормально. Если ресурс уже кэширован (то есть через событие установки), то он отлично работает, только когда я получаю страницу, которая не кэшируется.

Код моего сервисного работника:

self.addEventListener("fetch", function (event) {

if (event.request.method !== 'GET'
    || event.request.url.toLowerCase().indexOf('//ws') > -1
    || event.request.url.toLowerCase().indexOf('localws') > -1) {
    // Don't intercept requests made to the web service
    // If we don't block the event as shown below, then the request will go to
    // the network as usual.

    return;
}


event.respondWith(async function () {
    // override the default behavior

    var oCache = await caches.open('cp_' + version);
    var cached = await oCache.match(event.request.url);

    if (cached && cached.status < 300) {
        return cached;
    }

    // Need to make a call to the network
    try {
        var oResp = await fetch(event.request); // THIS LINE CAUSES THE PROBLEM!!!
        return oResp;
    } catch (oError) {
        console.log('SW WORKER: fetch request to network failed.', event.request);


        return new Response('<h1>Offline_sw.js: An error has occured. Please try again.</h1><br><h2>Could not load URL: ' + event.request.url + '</h2>', {
            status: 503,
            statusText: 'Service Unavailable',
            headers: new Headers({
                'Content-Type': 'text/html'
            })
        });
    }  
}()); // event.respondwith
}); // fetch

Линия:

var oResp = ожидание получения (event.request);

вызывается после того, как я определил, что он не кэшируется и кажется виновником. Когда происходит ошибка, я получаю следующую ошибку в catch (): 'Failed to fetch'

Fetch Error Message

Это кажется довольно общим и бесполезным. Опять же, это работает при работе через браузер, и поэтому я знаю, что это не проблема CORS, сервисный работник не в том каталоге и т. Д. Опять же, это работало до 3 недель назад, и теперь я получаю отчеты от клиентов, что это не работает ,

Вот снимок экрана фактического события. Запрос, который я отправляю:

event.request object

В инструментах разработчика Chrome (используемых для отладки веб-просмотра) я вижу следующее:

Dev Tools Screen SHot

Я что-то не так делаю или это ошибка в webview / chrome, которая была недавно выпущена? (Я говорю, что, поскольку Chrome обеспечивает веб-просмотр)

1 Ответ

1 голос
/ 28 июня 2019

Похоже, это была ошибка в хроме. См. Bugs.chromium.org/p/chromium/issues/detail?id=977784. Должно быть исправлено в v 76.

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

ServiceWorkerController oSWController = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
        oSWController = ServiceWorkerController.getInstance();
        oSWController.setServiceWorkerClient(new ServiceWorkerClient(){
            @Nullable
            @Override
            public WebResourceResponse shouldInterceptRequest(WebResourceRequest request){
                return super.shouldInterceptRequest(request);
            }
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...