iOS - Использование куки с WKWebView - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь использовать куки в iOS WKWebView следующим образом:

import UIKit
import WebKit

class ViewWrapper: UIViewController, WKNavigationDelegate{

@IBOutlet weak var viewerWebKit: WKWebView!
var loginToken: String?

override func viewDidLoad() {
    super.viewDidLoad()

    let url = URL(string: "url")!

    let newcookie = HTTPCookie(properties: [
        .domain: "domain",
        .path: "/",
        .name: "cookie name",
        .value: "cookie value",
        .secure: "FALSE",
        .expires: NSDate(timeIntervalSinceNow: 31556926)
        ])

    var request = URLRequest(url: url)
    request.httpShouldHandleCookies = true
    viewerWebKit.configuration.websiteDataStore.httpCookieStore.setCookie(newcookie!, completionHandler: {
        print("cookie setup done")
        self.viewerWebKit.load(request)
    })

    let refresh = UIBarButtonItem(barButtonSystemItem: .refresh, target: webView, action: #selector(viewerWebKit.reload))
    toolbarItems = [refresh]
    navigationController?.isToolbarHidden = false
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func loadView() {
    viewerWebKit = WKWebView()
    viewerWebKit.navigationDelegate = self
    view = viewerWebKit
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    title = webView.title
}

}

Домен, путь, имя и значение на 100% верны.Но когда я пытаюсь получить их и затем распечатать на моем веб-сайте, файлы cookie не устанавливаются.Печать файлов cookie на веб-сайте работает хорошо, потому что я сделал для этого приложение для Android, и оно работало там хорошо.

Нужно ли делать что-то еще, чтобы принимать или хранить куки?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Установите cookie таким образом и передайте secure флаг "FALSE" и path с помощью "/"

let newcookie = HTTPCookie(properties: [
                    .domain: "domain",
                    .path: "/",
                    .name: "cookie name",
                    .value: "cookie value",
                    .secure: "FALSE",
                    .expires: NSDate(timeIntervalSinceNow: 31556926)
                    ])

Установите cookie и дождитесь завершения блока дозагрузите свою страницу.

self.configuration.websiteDataStore.httpCookieStore.setCookie(headerCookie, completionHandler: {
     print("cookie setup done")
     viewerWebKit.load(URLRequest(url: url))

})

После того, как хотите видеть, что куки обновляются или нет, просто добавьте наблюдатель изменения значения куки, как этот способ.

 WKWebsiteDataStore.default().httpCookieStore.add(self)


 func cookiesDidChange(in cookieStore: WKHTTPCookieStore) {
    cookieStore.getAllCookies({ (cookies) in
        cookies.forEach({ (cookie) in
            print(cookie.name)
        })
    })
}

Теперь вы можете просматривать файлы cookie в методе cookiesDidChange .

0 голосов
/ 16 октября 2018

Вот отдельный пример настройки файла cookie, который должен быть доступен для чтения с веб-сайта, загруженного в веб-представление.Ключевым моментом является то, что домен должен соответствовать домену веб-сайта, срок действия файла cookie должен быть установлен на будущую дату , и это работает только для меня с флагом secure, установленным на false, не уверенпочему.

Используя приведенный ниже пример, я смог увидеть куки в окне проверки браузера.

import UIKit
import WebKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let wv = WKWebView();
        view = wv;
        let cookie = HTTPCookie(properties: [
            .domain: ".example.com",
            .path: "",
            .name: "name",
            .value: "hello world",
            .expires: Date(timeIntervalSince1970: 1639655995)
        ])!
        wv.loadHTMLString("", baseURL: URL(string: "http://www.example.com")!);
        wv.configuration.websiteDataStore.httpCookieStore.setCookie(cookie)
    }
}
...