WebView:以编程方式清除服务工作者缓存

抹布工

为了给用户提供一种清除缓存的快速方法,我正在使用以下功能(基于thisthis)附加到“清除缓存”按钮上:

static void clearAppCache(Context context) {
    try {
        File dir = context.getCacheDir();
        deleteDir(dir);
    } catch (Exception e) {
        // TODO: handle exception
    }
}

private static boolean deleteDir(File dir) {
    if (dir != null && dir.isDirectory()) {
        String[] children = dir.list();
        for (String aChildren : children) {
            boolean success = deleteDir(new File(dir, aChildren));
            if (!success) {
                return false;
            }
        }
        return dir.delete();
    } else if (dir!= null && dir.isFile()) {
        return dir.delete();
    } else {
        return false;
    }
}

我还使用相同的缓存路径设置了WebView,如下所示:

WebSettings webSettings = mWebView.getSettings();
webSettings.setAppCacheEnabled(true);
String cachePath = getApplicationContext().getCacheDir().getAbsolutePath();
webSettings.setAppCachePath(cachePath);

我的理论是,调用clearAppCache()还会清除WebView的缓存,因为它所做的只是清除与我为WebView设置的相同的缓存文件夹。

但是由于我的WebView现在正在加载使用服务工作者的页面,所以我发现这似乎并没有清除服务工作者缓存。我收到一个用户的报告,为了真正清除服务工作者的东西,他们必须手动清除以下文件夹的内容(在其root用户的设备上):

/data/data/com.example.myapp/app_webview/Cache/

根据这篇文章,我尝试将以下行添加到我的clearAppCache()函数中:

WebStorage.getInstance().deleteAllData();

但这似乎并没有清除服务工作者缓存的效果。

有任何想法吗?是的,我知道可以使用javascript清除服务工作者缓存(请参阅上面的链接),但是我想要一种直接从Android执行此操作的方法。

抹布工

我现在找到了一种删除服务工作者缓存的方法。我的数据目录位于:

/data/user/0/com.app.package

然后是:

/cache
    /http
    /org.chromium.android_webview
    /WebView
/code_cache
/files
/shared_prefs
/app_webview
    /webview_data.lock
    /Web Data
    /Web Data-journal
    /metrics_guid
    /Cookies
    /Cookies-journal
    /GPUCache
    /Service Worker
    /QuotaManager
    /QuotaManager-journal
    /databases
/app_textures
/app_download_internal
/databases
/shaders

请注意,其中存在Service Worker子目录app_webview,这是一个赠品。

因此,要清除服务工作者缓存,似乎只需要删除该子目录:

File dataDir = context.getDataDir(); // or see https://stackoverflow.com/a/19630415/4070848 for older Android versions
File serviceWorkerDir = new File(dataDir.getPath() + "/app_webview/Service Worker/");
deleteDir(serviceWorkerDir); // function defined in original post

或者,更残酷的是,您似乎可以删除整个app_webview子文件夹及其中的所有内容:

File dataDir = context.getDataDir(); // or see https://stackoverflow.com/a/19630415/4070848 for older Android versions
File appWebViewDir = new File(dataDir.getPath() + "/app_webview/");
deleteDir(appWebViewDir); // function defined in original post

仍然令我困惑的是,尽管将WebView的缓存路径设置为webSettings.setAppCachePath(cachePath)在缓存目录中(请参阅我的原始文章),但WebView还是选择app_webview用于服务人员缓存。也许它将缓存目录用于传统的http缓存,并选择其自己的位置(app_webview)用于服务工作者的缓存?但这似乎仍然不正确。此外,如前所述,一个用户报告了中存在一个Cache子目录app_webview,并且他们位于不支持服务工作者的KitKat(Android 4.4)上……不确定为什么使用该app_webview/Cache目录而不是(或在其中)除了)cache我一点都没有app_webview/Cache

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何卸载服务工作者?

Javascript服务工作者:从缓存中获取资源,但也进行更新

服务工作者和软件预缓存的“新版本可用”

是否可以修改服务工作者缓存响应标头?

服务工作者和客户端请求“缓存控制”:“无缓存”

使Web应用程序脱机-应用程序缓存或服务工作者哪个更好?

使用CSRF令牌缓存请求时,如何减少服务工作者缓存的大小

服务工作者不会从缓存中返回文件

具有SSL证书缓存的服务工作者

PWA服务工作者缓存/更新预期行为

notificationclick事件服务工作者

将服务工作者保存在缓存中有意义吗?

根据年龄删除服务工作者缓存中的条目

注销时如何清除服务工作者缓存?

延迟加载或预加载Angular模块并使用服务工作者来缓存结果?

从create-react-app中的服务工作者缓存中排除index.html

在服务工作者中服务之前,可以编辑缓存的index.html吗?

通常,服务工作者应预缓存哪些文件?

如何防止服务工作者删除缓存,PWA

如何由服务工作者更新缓存的资源

服务工作者查询缓存算法是否允许表达式匹配URL路径?

服务工作者中的XMLHttpRequest

检查服务工作者缓存中是否存在URL

服务工作者缓存文件但不离线加载

服务工作者从磁盘缓存中缓存资源

服务工作者在反应中缓存的路由

服务工作者缓存与 VuexPersistence

角度缓存 - 我们应该使用服务工作者吗?

服务工作者缓存破坏谷歌地图 api