新しい言語のSwiftを使用してWebビューでCookieを管理する方法を簡単に確認できるトピックがあるとしたらどうでしょうか。インターネットをチェックインすると、これを実装する必要があるときに何も面白いものが見つかりません。 Appleによるドキュメンテーションも貧弱です。
Swiftでこれらのプロセスを処理する方法を知っている人はいますか?これは私が見つけたものですが、Obj-Cで:
保存されたクッキーを見る
NSHTTPCookie *cookie;
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [cookieJar cookies]) {
NSLog(@"%@", cookie);
}
保存されたクッキーの削除
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [storage cookies]) {
[storage deleteCookie:cookie];
}
[[NSUserDefaults standardUserDefaults] synchronize];
これに対する答えを一度だけ与えることができれば、誰にとっても素晴らしいことです!乾杯!
このコードを試してください:
保存されたクッキーを見る
if let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookies {
for cookie in cookies {
NSLog("\(cookie)")
}
}
保存されたクッキーの削除
var storage : NSHTTPCookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies as! [NSHTTPCookie]{
storage.deleteCookie(cookie)
}
Swift 2.
let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies! {
storage.deleteCookie(cookie)
}
Swift 3.
if let cookies = HTTPCookieStorage.shared.cookies {
for cookie in cookies {
NSLog("\(cookie)")
}
}
let storage = HTTPCookieStorage.shared
for cookie in storage.cookies! {
storage.deleteCookie(cookie)
}
Cookieを保存
func saveCookies() {
guard let cookies = HTTPCookieStorage.shared.cookies else {
return
}
let array = cookies.flatMap { (cookie) -> [HTTPCookiePropertyKey: Any]? in
cookie.properties
}
UserDefaults.standard.set(array, forKey: "cookies")
UserDefaults.standard.synchronize()
}
Cookieのロード:
func loadCookies() {
guard let cookies = UserDefaults.standard.value(forKey: "cookies") as? [[HTTPCookiePropertyKey: Any]] else {
return
}
cookies.forEach { (cookie) in
guard let cookie = HTTPCookie.init(properties: cookie) else {
return
}
HTTPCookieStorage.shared.setCookie(cookie)
}
}
これらの関数は、次のコードのように呼び出すことができます
func webViewDidStartLoad(_ webView: UIWebView) {
loadCookies()
}
func webViewDidFinishLoad(_ webView: UIWebView) {
saveCookies()
}
webViewDidStartLoadおよびwebViewDidFinishLoadのWebViewのデリゲートを忘れないでください
Swift 2.
let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies! {
storage.deleteCookie(cookie)
}
NSUserDefaults.standardUserDefaults().synchronize()
Swift "translation" ...に感謝します。削除をas!に変更してダウンキャストを強制する必要がありました。
var storage : NSHTTPCookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies as! [NSHTTPCookie]
{
storage.deleteCookie(cookie)
}
NSUserDefaults.standardUserDefaults()
Swift 4で作業している場合、このコードはcookiesとRLキャッシュの削除を無効にします。
let cookieJar : HTTPCookieStorage = HTTPCookieStorage.shared
for cookie in cookieJar.cookies! as [HTTPCookie]{
NSLog("cookie.domain = %@", cookie.domain)
cookieJar.deleteCookie(cookie)
}
URLCache.shared.removeAllCachedResponses()
URLCache.shared.diskCapacity = 0
URLCache.shared.memoryCapacity = 0
UIWebViewのデリゲート関数を使用してCookieをキャプチャする方法に関する完全な回答を次に示します。
func webViewDidFinishLoad(_ webView: UIWebView) {
if let cookies = HTTPCookieStorage.shared.cookies {
for cookie in cookies {
print("cookie= \(cookie)")
}
}
}
Cookieはデフォルトとして保存され、このデリゲート関数はwebviewのロードで終了したすべての動きを呼び出すことに注意してください。 (Swift 3.0.1で更新されています)
API VKontakteのログアウト、Swift 3+
let dataStore = WKWebsiteDataStore.default()
dataStore.fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { (records) in
for record in records {
if record.displayName.contains("facebook") {
dataStore.removeData(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(), for: [record], completionHandler: {
print("Deleted: " + record.displayName);
})
}
}
}
Swift
let storage = HTTPCookieStorage.shared
for cookie in storage.cookies! {
storage.deleteCookie(cookie)
}