เหตุผลที่โพสต์คำตอบนี้คือฉันลองใช้วิธีแก้ปัญหามากมาย แต่ไม่มีใครทำงานได้อย่างถูกต้องคำตอบส่วนใหญ่ไม่ทำงานในกรณีที่ต้องตั้งค่าคุกกี้เป็นครั้งแรกและได้รับผลคุกกี้ที่ไม่ซิงค์ในครั้งแรกโปรดใช้วิธีนี้ใช้ได้กับทั้งสองอย่าง iOS> = 11.0 <= iOS 11 ถึง 8.0 ยังทำงานร่วมกับการซิงค์คุกกี้ครั้งแรก
สำหรับ iOS> = 11.0
- Swift 4.2
รับคุกกี้ httpและตั้งค่าในที่เก็บคุกกี้wkwebviewด้วยวิธีนี้เป็นจุดที่ยุ่งยากมากในการโหลดคำขอของคุณในwkwebviewต้องส่งคำขอเพื่อโหลดเมื่อคุกกี้จะถูกตั้งค่าอย่างสมบูรณ์นี่คือฟังก์ชั่นที่ฉันเขียน
ฟังก์ชั่นการโทรพร้อมการปิดเมื่อเสร็จสมบูรณ์คุณเรียกโหลด webview FYI ฟังก์ชั่นนี้จัดการเฉพาะ iOS> = 11.0
self.WwebView.syncCookies {
if let request = self.request {
self.WwebView.load(request)
}
}
นี่คือการใช้งานสำหรับฟังก์ชัน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()
}
}
สำหรับ iOS 8 จนถึง iOS 11
คุณต้องตั้งค่าบางอย่างเพิ่มเติมที่คุณต้องใช้ในการตั้งค่าคุกกี้สองครั้งโดยใช้WKUserScriptและอย่าลืมเพิ่มคุกกี้ตามคำขอด้วยมิฉะนั้นคุกกี้ของคุณจะไม่ซิงค์ในครั้งแรกและคุณจะเห็นว่าหน้าเว็บของคุณโหลดไม่ถูกต้องในครั้งแรก นี่คือสิ่งที่ฉันพบว่ารองรับคุกกี้สำหรับ iOS 8.0
ก่อนที่คุณจะสร้างวัตถุ 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))
}
เน้นที่ฟังก์ชัน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
}
นี่คือขั้นตอนอื่น ๆ ที่ wkuserscript ไม่ได้ซิงค์คุกกี้ในทันทีมีหลายอย่างที่ต้องโหลดหน้าครั้งแรกที่มีคุกกี้คือการโหลด webview อีกครั้งหากมันยุติกระบวนการ แต่ฉันไม่แนะนำให้ใช้มันไม่ดีสำหรับมุมมองของผู้ใช้ heck คือเมื่อใดก็ตามที่คุณพร้อมที่จะโหลดคุกกี้ชุดคำขอในส่วนหัวของคำขอเช่นกันวิธีนี้อย่าลืมเพิ่มการตรวจสอบเวอร์ชัน iOS ก่อนที่จะขอโหลดเรียกใช้ฟังก์ชันนี้
request?.addCookies()
ฉันเขียนส่วนขยายสำหรับ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
}
}
}
}
ตอนนี้คุณพร้อมที่จะทดสอบ iOS> 8 แล้ว