Подтвердить что ты не робот

Как управлять кукисами с помощью UIWebView в Swift

Как насчет темы, в которой люди могут легко увидеть, как управлять кукисами в веб-просмотре, используя новый язык Swift? Если вы зарегистрируетесь в Интернете, вы не найдете ничего интересного, когда вам нужно это реализовать. Даже документация с яблоком оставляет желать лучшего.

Кто-нибудь знает, как обрабатывать этот процесс в 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];

Было бы хорошо для всех, если бы мы могли дать на этот раз ответ на этот вопрос! Ура!

4b9b3361

Ответ 1

Попробуйте этот код:

СМОТРИТЕ КОРПУСЫ

    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.0

let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies! {
 storage.deleteCookie(cookie)
}

Swift 3.0

if let cookies = HTTPCookieStorage.shared.cookies {
    for cookie in cookies {
        NSLog("\(cookie)")
    }
}

let storage = HTTPCookieStorage.shared
for cookie in storage.cookies! {
    storage.deleteCookie(cookie)
}

Ответ 2

swift 2.0

let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies! {
 storage.deleteCookie(cookie)
}
NSUserDefaults.standardUserDefaults().synchronize()

Ответ 3

Спасибо за быстрый "перевод"... Просто нужно изменить удаление как! чтобы заставить downcast:

var storage : NSHTTPCookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie in storage.cookies  as! [NSHTTPCookie]
{
    storage.deleteCookie(cookie)
}
NSUserDefaults.standardUserDefaults()

Ответ 4

Вот полный ответ с тем, как захватить файлы cookie с помощью функции делегата UIWebView:

func webViewDidFinishLoad(_ webView: UIWebView) {
    if let cookies = HTTPCookieStorage.shared.cookies {
        for cookie in cookies {
            print("cookie= \(cookie)")
        }
    }
}

Имейте в виду, что файлы cookie будут сохранены по умолчанию, и эта функция делегата вызывает все движения, которые заканчиваются загрузкой webview. (Он также обновлен с помощью Swift 3.0.1)

Ответ 5

скоростная версия 3 четкой версии

Сохранить файлы 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()
}

Не забывайте иметь делегата вашего WebView для webViewDidStartLoad и webViewDidFinishLoad

Ответ 6

swift 3

    let storage = HTTPCookieStorage.shared

    for cookie in storage.cookies! {
        storage.deleteCookie(cookie)
    }

Ответ 7

Выход для api ВКонтакте, быстрый 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);
            })
        }
    }
}