在Swift中清除UIWebView的缓存

u59ebvdq  于 2023-05-05  发布在  Swift
关注(0)|答案(6)|浏览(139)

我的应用程序中有一个UIWebView。此UIWebView需要完全重新加载(即清除所有缓存的图像/HTML/饼干等)每次当viewDidLoad.
那么有没有什么代码可以在Swift中实现呢?
下面是我的代码:

let myUrl = NSURL(string: "http://www.example.com")
let myRequest = NSURLRequest(URL: myUrl!)
myWebView.loadRequest(myRequest)

谢谢!

h7appiyu

h7appiyu1#

你可以用

NSURLCache.sharedURLCache().removeAllCachedResponses()
NSURLCache.sharedURLCache().diskCapacity = 0
NSURLCache.sharedURLCache().memoryCapacity = 0

Swift 3.0

URLCache.shared.removeAllCachedResponses()
URLCache.shared.diskCapacity = 0
URLCache.shared.memoryCapacity = 0

您还可以更改NSURLRequest该高速缓存策略

let day_url = NSURL(string: "http://www.domain.com")
let day_url_request = NSURLRequest(URL: day_url,
    cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData,
    timeoutInterval: 10.0)

let day_webView = UIWebView()
day_webView.loadRequest(day_url_request)

Swift 3.0

let day_url = URL(string: "http://www.domain.com")
let day_url_request = URLRequest(url: day_url!,
    cachePolicy:NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData,
    timeoutInterval: 10.0)

let day_webView = UIWebView()
day_webView.loadRequest(day_url_request)

有关缓存策略的详细信息:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLRequest_Class/index.html#//apple_ref/c/tdef/NSURLRequestCachePolicy

kokeuurv

kokeuurv2#

Swift 4:

final class WebCacheCleaner {

    class func clear() {
        URLCache.shared.removeAllCachedResponses()

        HTTPCookieStorage.shared.removeCookies(since: Date.distantPast)
        print("[WebCacheCleaner] All cookies deleted")

        WKWebsiteDataStore.default().fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in
            records.forEach { record in
                WKWebsiteDataStore.default().removeData(ofTypes: record.dataTypes, for: [record], completionHandler: {})
                print("[WebCacheCleaner] Record \(record) deleted")
            }
        }
    }

}

// Usage
WebCacheCleaner.clear()

较旧版本:

NSURLCache.sharedURLCache().removeAllCachedResponses()
if let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookies {
    for cookie in cookies {
        NSHTTPCookieStorage.sharedHTTPCookieStorage().deleteCookie(cookie)
    }
}
js5cn81o

js5cn81o3#

Swift 3.

URLCache.shared.removeAllCachedResponses()
URLCache.shared.diskCapacity = 0
URLCache.shared.memoryCapacity = 0

if let cookies = HTTPCookieStorage.shared.cookies { 
    for cookie in cookies {
        HTTPCookieStorage.shared.deleteCookie(cookie)
    }
}
ivqmmu1c

ivqmmu1c4#

Swift 4

func clear(cache: Bool, cookies: Bool) {
    if cache { clearCache() }
    if cookies { clearCookies() }
}

fileprivate func clearCache() {
    URLCache.shared.removeAllCachedResponses()
    URLCache.shared.diskCapacity = 0
    URLCache.shared.memoryCapacity = 0
}

fileprivate func clearCookies() {
    let cookieStorage = HTTPCookieStorage.shared

    guard let cookies = cookieStorage.cookies else { return }

    for cookie in cookies {
        cookieStorage.deleteCookie(cookie)
    }
}

如果想要获得私密的浏览体验,您可能还需要按照以下步骤设置WKWebViewConfiguration对象的websiteDataStore属性。

let configuration = WKWebViewConfiguration()
    configuration.websiteDataStore = WKWebsiteDataStore.nonPersistent()
    ...
hivapdat

hivapdat5#

真的很管用

func clean() {
    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: {})
        }
    }
}
ghg1uchk

ghg1uchk6#

在我看来,这是一个很好的解决办法

import Foundation
import WebKit

extension WKWebView {
    func clearCookiesAndCache() {
         guard let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache, WKWebsiteDataTypeLocalStorage, WKWebsiteDataTypeCookies]) as? Set<String> else { return }
         let dateFrom = Date.init(timeIntervalSince1970: 0)
         WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes, modifiedSince: dateFrom) {
             print("Website Data Deleted Successfully")
         }
         URLCache.shared.removeAllCachedResponses()
         HTTPCookieStorage.shared.removeCookies(since: Date.distantPast)
         print("Cookies Deleted Successfully")
     }
}

使用方法:

let webView = WKWebView()
webView.clearCookiesAndCache()

相关问题