Bu cevabı göndermenin arkasındaki sebep, birçok çözümü denedim ama kimse düzgün çalışmıyor, cevabın çoğu ilk seferde çerezi ayarlamanız gerektiğinde ve sonuç çerezinin ilk seferde senkronize edilmemesi durumunda çalışmıyor, Lütfen bu çözümü kullanın, her ikisi için de işe yarıyor iOS> = 11.0 <= iOS 11 ila 8.0, ilk seferde çerez senkronizasyonuyla da çalışır.
İOS> = 11.0
- Swift 4.2 için
Http çerezlerini alın ve wkwebview çerez deposunda bu şekilde ayarlayın, isteğinizi wkwebview'e yüklemek çok zor bir nokta , çerezler tamamen kurulduğunda yükleme isteği göndermelisiniz, işte yazdığım işlev.
Tamamlandığında kapanma işlevini çağırın, yük web görünümünü çağırın. Bilginize bu işlev yalnızca iOS> = 11.0'ı işler
self.WwebView.syncCookies {
if let request = self.request {
self.WwebView.load(request)
}
}
SyncCookies işlevi için uygulama burada .
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()
}
}
İOS 8'den iOS 11'e kadar
WKUserScript kullanarak iki seferlik tanımlama bilgisi ayarlamak için ihtiyaç duyduğunuz bazı ekstra şeyleri ayarlamanız gerekir ve istek üzerine tanımlama bilgileri eklemeyi de unutmayın, aksi takdirde tanımlama bilginiz ilk seferde senkronize olmaz ve sayfanızın ilk seferinde düzgün yüklenmediğini görürsünüz. iOS 8.0 için çerezleri desteklediğini bulduğum halt bu
Wkwebview nesne oluşturmadan önce.
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))
}
Bu işleve odaklanın 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
}
İşte diğer adım wkuserscript çerezleri hemen senkronize etmiyor, çerezle ilk kez sayfa yüklemek için çok fazla şey var, bir işlemi sonlandırırsa web görünümünü yeniden yüklemektir, ancak onu kullanmanızı önermiyorum, kullanıcı bakış açısı için iyi değil , heck, istek başlığına istek seti çerezlerini yüklemeye hazır olduğunuzda ve bu şekilde, iOS sürüm kontrolü eklemeyi unutmayın. yükleme talebinden önce bu işlevi çağırın.
request?.addCookies()
URLRequest için uzantı yazdım
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
}
}
}
}
artık iOS> 8'i test etmeye hazırsınız