代码之家  ›  专栏  ›  技术社区  ›  Matej KoÅ¡út

iOS-未设置web视图cookie

  •  1
  • Matej KoÅ¡út  · 技术社区  · 7 年前

    我正在尝试在iOS中设置cookies,如下所示:

        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)
            })
        })
    

    所有的曲奇都打印出来了,看起来都设置正常。但当我使用safari的Web检查器查看时,如果它们真的设置好了,那么就什么都没有了。没有饼干。有什么问题吗?我需要接受它们吗?safari会阻止他们吗?如何正常设置它们,使其在web inspector中可见?

    我也尝试过这种方法:

    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

    曲奇饼没有固定。

    这是我在Xcode的控制台中看到的。

    xcode console

    所以这里似乎是设定的。但事实并非如此。打印代码打印cookies。但它们在safari控制台中并不都可见。这怎么可能?Cookies csrftoken和sessionid由网站设置,而不是由我的应用程序设置。它们在打印和调试控制台中都可见。

    1 回复  |  直到 7 年前
        1
  •  0
  •   blastervla    5 年前

    让cookie经历这一切

    urlRequest.httpShouldHandleCookies = true
    

    也可以在请求后创建集合

    self.configuration.websiteDataStore.httpCookieStore.setCookie("your_http_cookie", completionHandler: {
        // Do whatever you want. I suggest loading your webview after cookie is set.
    })
    

    实现这一点 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
            })
        }
    }