Lý do đằng sau đăng câu trả lời này là tôi đã thử nhiều giải pháp nhưng không ai hoạt động đúng, hầu hết câu trả lời không hoạt động trong trường hợp phải đặt cookie lần đầu và có cookie kết quả không đồng bộ hóa lần đầu tiên, Vui lòng sử dụng giải pháp này cho cả hai iOS> = 11.0 <= iOS 11 đến 8.0, cũng hoạt động với đồng bộ hóa cookie lần đầu tiên.
Dành cho iOS> = 11.0
- Swift 4.2
Nhận cookie http và đặt trong cửa hàng cookie wkwebview như thế này, đây là điểm rất khó để tải yêu cầu của bạn trong wkwebview , phải gửi yêu cầu tải khi cookie sẽ được đặt hoàn toàn, đây là chức năng mà tôi đã viết.
Chức năng gọi với đóng hoàn thành, bạn gọi tải webview. FYI chức năng này chỉ xử lý iOS> = 11.0
self.WwebView.syncCookies {
if let request = self.request {
self.WwebView.load(request)
}
}
Đây là triển khai cho chức năng syncCookies .
func syncCookies(completion:@escaping ()->Void) {
if #available(iOS 11.0, *) {
if let yourCookie = "HERE_YOUR_HTTP_COOKIE_OBJECT" {
self.configuration.websiteDataStore.httpCookieStore.setCookie(yourCookie, completionHandler: {
completion()
})
}
} else {
//Falback just sent
completion()
}
}
Dành cho iOS 8 cho đến iOS 11
bạn cần thiết lập thêm một số thứ bạn cần để đặt cookie hai lần một thông qua WKUserScript và đừng quên thêm cookie theo yêu cầu, nếu không, cookie của bạn không đồng bộ hóa lần đầu tiên và bạn sẽ thấy trang của bạn không tải lần đầu đúng cách. đây là cái quái mà tôi thấy để hỗ trợ cookie cho iOS 8.0
trước khi bạn tạo đối tượng Wkwebview.
func setUpWebView() {
let userController: WKUserContentController = WKUserContentController.init()
if IOSVersion.SYSTEM_VERSION_LESS_THAN(version: "11.0") {
if let cookies = HTTPCookieStorage.shared.cookies {
if let script = getJSCookiesString(for: cookies) {
cookieScript = WKUserScript(source: script, injectionTime: .atDocumentStart, forMainFrameOnly: false)
userController.addUserScript(cookieScript!)
}
}
}
let webConfiguration = WKWebViewConfiguration()
webConfiguration.processPool = BaseWebViewController.processPool
webConfiguration.userContentController = userController
let customFrame = CGRect.init(origin: CGPoint.zero, size: CGSize.init(width: 0.0, height: self.webContainerView.frame.size.height))
self.WwebView = WKWebView (frame: customFrame, configuration: webConfiguration)
self.WwebView.translatesAutoresizingMaskIntoConstraints = false
self.webContainerView.addSubview(self.WwebView)
self.WwebView.uiDelegate = self
self.WwebView.navigationDelegate = self
self.WwebView.allowsBackForwardNavigationGestures = true // A Boolean value indicating whether horizontal swipe gestures will trigger back-forward list navigations
self.WwebView.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options: .new, context: nil)
self.view.addConstraint(NSLayoutConstraint(item: WwebView, attribute: .trailing, relatedBy: .equal, toItem: self.webContainerView, attribute: .trailing, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: WwebView, attribute: .leading, relatedBy: .equal, toItem: self.webContainerView, attribute: .leading, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: WwebView, attribute: .top, relatedBy: .equal, toItem: self.webContainerView, attribute: .top, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: WwebView, attribute: .bottom, relatedBy: .equal, toItem: self.webContainerView, attribute: .bottom, multiplier: 1, constant: 0))
}
Tập trung vào chức năng này getJSCookiesString
public func getJSCookiesString(for cookies: [HTTPCookie]) -> String? {
var result = ""
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
dateFormatter.dateFormat = "EEE, d MMM yyyy HH:mm:ss zzz"
for cookie in cookies {
if cookie.name == "yout_cookie_name_want_to_sync" {
result += "document.cookie='\(cookie.name)=\(cookie.value); domain=\(cookie.domain); path=\(cookie.path); "
if let date = cookie.expiresDate {
result += "expires=\(dateFormatter.string(from: date)); "
}
if (cookie.isSecure) {
result += "secure; "
}
result += "'; "
}
}
return result
}
Đây là một bước khác mà wkuserscript không đồng bộ hóa cookie ngay lập tức, có rất nhiều điều thú vị để tải trang lần đầu tiên với cookie, đó là tải lại webview một lần nữa nếu nó chấm dứt quá trình nhưng tôi không khuyên bạn nên sử dụng nó, nó không tốt cho quan điểm của người dùng , quái gì là bất cứ khi nào bạn sẵn sàng tải cookie đặt yêu cầu trong tiêu đề yêu cầu cũng như cách này, đừng quên thêm kiểm tra phiên bản iOS. trước khi tải yêu cầu gọi chức năng này.
request?.addCookies()
tôi đã viết tiện ích mở rộng cho URLRequest
extension URLRequest {
internal mutating func addCookies() {
//"appCode=anAuY28ucmFrdXRlbi5yZXdhcmQuaW9zLXpOQlRTRmNiejNHSzR0S0xuMGFRb0NjbUg4Ql9JVWJH;rpga=kW69IPVSYZTo0JkZBicUnFxC1g5FtoHwdln59Z5RNXgJoMToSBW4xAMqtf0YDfto;rewardadid=D9F8CE68-CF18-4EE6-A076-CC951A4301F6;rewardheader=true"
var cookiesStr: String = ""
if IOSVersion.SYSTEM_VERSION_LESS_THAN(version: "11.0") {
let mutableRequest = ((self as NSURLRequest).mutableCopy() as? NSMutableURLRequest)!
if let yourCookie = "YOUR_HTTP_COOKIE_OBJECT" {
// if have more than one cookies dont forget to add ";" at end
cookiesStr += yourCookie.name + "=" + yourCookie.value + ";"
mutableRequest.setValue(cookiesStr, forHTTPHeaderField: "Cookie")
self = mutableRequest as URLRequest
}
}
}
}
bây giờ bạn đã sẵn sàng để thử nghiệm iOS> 8