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

时间:2017-11-21 13:41:50

标签: android caching webview service-worker

为了让用户快速清除缓存,我使用了附加到Clear Cache按钮的以下功能(基于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/

基于this post我尝试将以下行添加到clearAppCache()函数中:

WebStorage.getInstance().deleteAllData();

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

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

2 个答案:

答案 0 :(得分:4)

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

/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

让我感到困惑的是,尽管将webSettings.setAppCachePath(cachePath)的WebView的缓存路径设置在缓存目录中(请参阅我的原始帖子),但WebView已选择使用app_webview进行服务工人缓存。也许它使用缓存目录进行传统的http缓存,并为服务工作者缓存选择自己的位置(app_webview)?但它似乎仍然不正确。此外,如上所述,一个用户报告Cache内存在app_webview子目录,并且它们位于不支持服务工作者的KitKat(Android 4.4)上...不知道为什么app_webview/Cache目录正在使用中,而不是(或除此之外)cache。我根本没有app_webview/Cache

答案 1 :(得分:2)

我不熟悉Android< - > WebView互动。但假设您可以从本地源页面的上下文中运行JavaScript,以下代码应该清除Cache Storage API中的所有内容:

async function clearAllCaches() {
  const allCaches = await caches.keys();
  for (const cache of allCaches) {
    caches.delete(cache);
  }
}

使用Clear-Site-Data header是另一种选择,如果您可以控制为您的HTML提供服务的远程网络服务器,并且您知道您的用户将拥有基于Chrome 61 +的WebView。