Alasan di balik memposting jawaban ini adalah saya mencoba banyak solusi tetapi tidak ada yang berfungsi dengan baik, sebagian besar jawabannya tidak berfungsi jika harus mengatur cookie pertama kali, dan mendapatkan cookie hasil tidak disinkronkan pertama kali, Silakan gunakan solusi ini berfungsi untuk keduanya iOS> = 11.0 <= iOS 11 hingga 8.0, juga berfungsi dengan sinkronisasi cookie pertama kali.
Untuk iOS> = 11.0
- Swift 4.2
Dapatkan http cookies dan atur di wkwebview cookie store seperti ini, ini sangat sulit untuk memuat permintaan Anda di wkwebview , harus mengirim permintaan untuk memuat ketika cookie akan diset sepenuhnya, di sini adalah fungsi yang saya tulis.
Fungsi panggilan dengan penutupan selesai Anda sebut memuat tampilan web. FYI fungsi ini hanya menangani iOS> = 11.0
self.WwebView.syncCookies {
if let request = self.request {
self.WwebView.load(request)
}
}
Berikut ini adalah implementasi untuk fungsi 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()
}
}
Untuk iOS 8 hingga iOS 11
Anda perlu mengatur beberapa hal tambahan yang Anda perlu mengatur dua cookie waktu satu melalui menggunakan WKUserScript dan jangan lupa untuk menambahkan cookie dalam permintaan juga, jika cookie Anda tidak disinkronkan pertama kali dan Anda akan melihat halaman Anda tidak memuat pertama kali dengan benar. ini adalah hal yang saya temukan untuk mendukung cookie untuk iOS 8.0
sebelum Anda membuat objek 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))
}
Fokus pada fungsi ini 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
}
Berikut ini langkah lain wkuserscript tidak menyinkronkan cookie segera, ada banyak cara untuk memuat halaman pertama kali dengan cookie satu adalah untuk memuat kembali tampilan web jika menghentikan proses tetapi saya tidak merekomendasikan untuk menggunakannya, itu tidak baik untuk sudut pandang pengguna , heck adalah setiap kali Anda siap untuk memuat cookie set permintaan di header permintaan juga seperti ini, jangan lupa untuk menambahkan cek versi iOS. sebelum memuat permintaan, panggil fungsi ini.
request?.addCookies()
saya menulis ekstensi untuk 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
}
}
}
}
sekarang Anda siap untuk menguji iOS> 8