【问题标题】:iOS - web view cookies not setiOS - 未设置网络视图 cookie
【发布时间】:2019-03-26 12:44:16
【问题描述】:

我正在尝试像这样在我的 iOS 中设置 cookie:

    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 都被打印出来,并且它们似乎设置正常。但是当我使用我的 safari 的 Web 检查器查看时,如果它们真的设置好了,那么什么都没有。没有设置 cookie。问题是什么?我需要接受它们吗? Safari 会阻止他们吗?如何正常设置它们,以便在 Web 检查器中可见?

我也试过这种方法:

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 调试控制台中看到的:

Cookie 未设置。

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

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

【问题讨论】:

  • 你完全错了,你在标题中设置cookie而不是httpCookieStore,你想为哪个iOS版本设置co​​okie,因为对于11以上的iOS,你可以使用http cookie store和iOS
  • 对于 Safari,您可以通过开发选项卡检查器设置 cookie,并且在其中显示 cookie 的位置有存储选项卡。
  • 为 11 以上的 iOS 开发。这正是我使用 Safari 所做的,但存储选项卡中没有 cookie。
  • 不需要在header中设置cookie,在httpcookie存储中设置cookie即可。
  • 像这样:stackoverflow.com/questions/52815182/… ?那是我的另一个问题:D 也不起作用。

标签: ios swift cookies uiwebview wkwebview


【解决方案1】:

通过这个设置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
        })
    }
}

【讨论】:

  • 我尝试了这种方法,只是将我的整个代码和输出添加到我的问题中。你可以看看。
  • 如果在控制台显示,则表示它正在设置为 wkwebview 的 cookie 空间。
  • 您正在设置的 csrf cookie,我可以在图像中看到它在 safari 上
  • 是的,它是由网站设置的,并且在 safari 的控制台和 Xcode 的终端中都可见。但是我在我的应用程序中设置的那些 cookie 仅在 Xcode 的终端中可见,而不在 safari 的控制台中可见。所以它们似乎被某种方式阻止或设置不正确
猜你喜欢
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多