如何在WKWebview中删除缓存?

Sra*_*van 30 ios ios8 wkwebview

任何人都在使用WKWebview并尝试清除缓存?如果有,该怎么办?举个例子?

PS:正常NSURLCache无效.

Shi*_*ama 52

在iOS 9中

// Optional data
NSSet *websiteDataTypes
= [NSSet setWithArray:@[
                        WKWebsiteDataTypeDiskCache,
                        //WKWebsiteDataTypeOfflineWebApplicationCache,
                        WKWebsiteDataTypeMemoryCache,
                        //WKWebsiteDataTypeLocalStorage,
                        //WKWebsiteDataTypeCookies,
                        //WKWebsiteDataTypeSessionStorage,
                        //WKWebsiteDataTypeIndexedDBDatabases,
                        //WKWebsiteDataTypeWebSQLDatabases,
                        //WKWebsiteDataTypeFetchCache, //(iOS 11.3, *)
                        //WKWebsiteDataTypeServiceWorkerRegistrations, //(iOS 11.3, *)
                        ]];
// All kinds of data
// NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
// Date from
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
// Execute
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
   // Done
}];
Run Code Online (Sandbox Code Playgroud)


Esq*_*uth 36

Swift版本:

let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache])
let date = Date(timeIntervalSince1970: 0)
WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes as! Set<String>, modifiedSince: date, completionHandler:{ })
Run Code Online (Sandbox Code Playgroud)

Swift3版本:

if #available(iOS 9.0, *) {
  let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache])
  let date = NSDate(timeIntervalSince1970: 0)
  WKWebsiteDataStore.defaultDataStore().removeDataOfTypes(websiteDataTypes as! Set<String>, modifiedSince: date, completionHandler:{ })
} else {
    var libraryPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, false).first!
    libraryPath += "/Cookies"

    do {
      try NSFileManager.defaultManager().removeItemAtPath(libraryPath)
    } catch {
      print("error")
    }
    NSURLCache.sharedURLCache().removeAllCachedResponses()
}
Run Code Online (Sandbox Code Playgroud)

  • 很好谢谢。Swift(至少 2.0)允许对类型进行推断和简化:`let types = Set([WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache])` 然后在 `remove` 调用中不需要桥接 (2认同)
  • 为什么您以“NSSet”启动,然后强制转换为“Set&lt;String&gt;”?您可以直接作为 Set 启动:`let types = Set&lt;String&gt;([WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache])` (2认同)

har*_*lee 7

我能够通过让我的 WKWebView 评估 window.location.reload 来解决这个问题。我在网络视图上有一个点击手势识别器,每当它检测到两次触摸的双击时,我都会运行以下命令:

webView.evaluateJavaScript("window.location.reload(true)", completionHandler: nil);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


Pet*_*inz 7

删除缓存和Cookies

# WKWebView+Clean.swift

import WebKit

extension WKWebView {
    class func clean() {
        guard #available(iOS 9.0, *) else {return}

        HTTPCookieStorage.shared.removeCookies(since: Date.distantPast)

        WKWebsiteDataStore.default().fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in
            records.forEach { record in
                WKWebsiteDataStore.default().removeData(ofTypes: record.dataTypes, for: [record], completionHandler: {})
                #if DEBUG
                    print("WKWebsiteDataStore record deleted:", record)
                #endif
            }
        }  
    }
}
Run Code Online (Sandbox Code Playgroud)

例:

import WebKit
...
WKWebview.clean()
Run Code Online (Sandbox Code Playgroud)


Shi*_*ama 5

仅使用 NSURLCache 无法删除缓存。经过多次尝试,我可以通过以下步骤清除缓存(从 iOS 8.1.1 开始):

  1. 使用 NSURLCache 删除缓存的方式与在 UIWebView 上执行的方式相同。如果您使用WKProccessPool,请重新初始化它。
  2. 删除Caches中的目录Library
  3. 删除所有 WKWebView

下次创建 WKWebView 时,应该清除缓存。

ShingoFukuyama/WKWebViewTips