javascript - Fetch() 请求在通过 Android Webview 运行的服务 worker 中立即失败

标签 javascript android android-webview service-worker fetch-api

我有一个 service worker,用于启用我网站的离线版本。这很好用。我还有一个 Android 应用程序,它基本上只是加载我的网站的 webview 的包装器。

一切都很好,直到大约 2-3 周前 Fetch() 请求开始立即失败。它仅在通过 Android webview 运行时失败。通过浏览器运行工作正常。如果资源已经被缓存(即通过安装事件)那么它工作得很好,只有当我得到一个没有被缓存的页面时。

我的 service worker 中的代码:

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 = await fetch(event.request);

一旦我确定它没有被缓存并且似乎是罪魁祸首,就会被调用。当它出错时,我在 catch() 中收到以下错误:'Failed to fetch'

Fetch Error Message

这看起来很笼统,没有帮助。同样,这在通过浏览器时有效,所以我知道这不是 CORS 问题,错误目录中的服务人员等。同样,它在大约 3 周前有效,现在我收到客户的报告说它不起作用.

这是我发送的实际事件的屏幕截图。请求:

event.request object

在 chrome 开发人员工具(用于调试 webview)中,我看到以下内容:

Dev Tools Screen SHot

我做错了什么或者这是最近发布的 webview/chrome 中的错误? (我这么说是因为 chrome 支持 webview)

最佳答案

看起来这是 Chrome 中的一个错误。请参阅 bugs.chromium.org/p/chromium/issues/detail?id=977784。应该在第 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);
            }
        });
    }

关于javascript - Fetch() 请求在通过 Android Webview 运行的服务 worker 中立即失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56719340/

相关文章:

android - 使用 API 30 通过 PDF.js 加载 PDF

javascript - 是否可以对 CSS 动画进行排队(示例)?

javascript - jQuery 自动完成在 $.ajax 中找不到 $(this)

javascript - JavaScript 中的函数是对象吗?

javascript - 动态添加后图像不显示

android - 缓存访问被拒绝-eclipse-emulator

android - 如何覆盖(或隐藏)Android 库项目中定义的样式属性?

java - ClassNotFoundException 安卓

android - 在 textview 中单击链接后,如何在 webview 而不是默认浏览器中打开该链接?

Android WebView LoadUrl 错误文件未找到