iOS - файлы cookie для веб-просмотра не установлены - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь установить файлы cookie в моей iOS следующим образом:

    let url = URL(string: "url")!
    let jar = HTTPCookieStorage.shared
    let cookieHeaderField = ["Set-Cookie": "key1=value1, key2=value2"]
    let cookies = HTTPCookie.cookies(withResponseHeaderFields: cookieHeaderField, for: url)
    jar.setCookies(cookies, for: url, mainDocumentURL: url)

    let request = URLRequest(url: url)

    viewerWebKit.load(request)

Затем я печатаю их так:

    viewerWebKit.configuration.websiteDataStore.httpCookieStore.getAllCookies( { (cookies) in
        cookies.forEach({ (cookie) in
            print(cookie.name)
        })
    })

Все файлы cookie печатаются и кажутсяустановить нормально.Но когда я использую веб-инспектор моего сафари, чтобы увидеть, действительно ли они установлены, тогда ничего не происходит.Файлы cookie не установлены.В чем проблема?Нужно ли их принимать?Сафари блокирует их?Как я могу установить их нормально, чтобы они были видны в веб-инспекторе?

Я также попробовал этот подход:

import UIKit
import WebKit

class ViewWrapper: UIViewController, WKNavigationDelegate {

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

override func viewDidLoad() {
    super.viewDidLoad()

    var urlRequest = URLRequest(url: URL(string: "url")!)
    urlRequest.httpShouldHandleCookies = true

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

    viewerWebKit.configuration.websiteDataStore.httpCookieStore.setCookie(newcookie!, completionHandler: {
        self.viewerWebKit.load(urlRequest)
    })

    viewerWebKit.configuration.websiteDataStore.httpCookieStore.getAllCookies( { (cookies) in
        cookies.forEach({ (cookie) in
            print(cookie.name)
        })
    })

}

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
}

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

}

, но он тоже не работал.

Вот что я вижу в консоли отладки safari: debug console

Файлы cookie не установлены.

Это то, что я вижу в консоли Xcode,

xcode console

Так что здесь, кажется, установлено.Но это не на самом деле.Печать кода печатает куки.Но они не все видны в консоли сафари.Как это возможно?Файлы cookie csrftoken и sessionid устанавливаются веб-сайтом, а не моим приложением.И они видны как на печатной, так и на отладочной консоли.

1 Ответ

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

Установите cookie через это.также после запроса создайте набор

urlRequest.httpShouldHandleCookies = true


self.configuration.websiteDataStore.httpCookieStore.setCookie("your_http_cookie", completionHandler: {

// делайте что хотите.я рекомендую после набора файлов cookie загрузить ваше веб-представление.

 })

Реализовать этого наблюдателя WKHTTPCookieStoreObserver в вашем классе.

WKWebsiteDataStore.default().httpCookieStore.add(self)
 func cookiesDidChange(in cookieStore: WKHTTPCookieStore) {
    // Must implement otherwise wkwebview cookie not sync properly
    self.httpCookieStore.getAllCookies { (cookies) in
        cookies.forEach({ (cookie) in
           // print your cookie here
        })
    }
}
...