Der Grund für das Posten dieser Antwort ist, dass ich viele Lösungen ausprobiert habe, aber niemand richtig funktioniert. Die meisten Antworten funktionieren nicht, wenn das Cookie zum ersten Mal gesetzt werden muss und das Ergebnis-Cookie beim ersten Mal nicht synchronisiert wird. Verwenden Sie diese Lösung, es funktioniert für beide iOS> = 11.0 <= iOS 11 bis 8.0, funktioniert auch beim ersten Mal mit der Cookie-Synchronisierung.
Für iOS> = 11.0
- Swift 4.2
Holen Sie sich http-Cookies und setzen Sie sie auf diese Weise im wkwebview- Cookie-Store. Es ist sehr schwierig, Ihre Anfrage in wkwebview zu laden , muss Anfrage zum Laden gesendet werden, wenn Cookies vollständig gesetzt werden, hier ist die Funktion, die ich geschrieben habe.
Rufen Sie die Funktion mit Schließung in Vollendung rufen Sie Last Webansicht. Zu Ihrer Information, diese Funktion behandelt nur iOS> = 11.0
self.WwebView.syncCookies {
if let request = self.request {
self.WwebView.load(request)
}
}
Hier ist die Implementierung für die syncCookies- Funktion.
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()
}
}
Für iOS 8 bis iOS 11
Sie müssen einige zusätzliche Dinge einrichten, die Sie benötigen, um zwei Zeit-Cookies mithilfe von WKUserScript zu setzen. Vergessen Sie nicht, auf Anfrage auch Cookies hinzuzufügen. Andernfalls wird Ihr Cookie beim ersten Mal nicht synchronisiert und Ihre Seite wird beim ersten Mal nicht richtig geladen. Dies ist der Teufel, den ich gefunden habe, um Cookies für iOS 8.0 zu unterstützen
bevor Sie Wkwebview Objekterstellung.
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))
}
Konzentrieren Sie sich auf diese Funktion 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
}
Hier ist ein weiterer Schritt, bei dem wkuserscript Cookies nicht sofort synchronisiert. Es ist sehr schwierig, die erste Seite mit einem Cookie zu laden. Sie müssen die Webansicht erneut laden, wenn der Prozess beendet wird. Ich empfehle jedoch nicht, sie zu verwenden. Dies ist aus Sicht des Benutzers nicht gut Vergessen Sie nicht, die iOS-Versionsprüfung hinzuzufügen, wenn Sie bereit sind, Anforderungssatz-Cookies in den Anforderungsheader zu laden. Rufen Sie vor der Ladeanforderung diese Funktion auf.
request?.addCookies()
Ich habe eine Erweiterung für URLRequest geschrieben
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
}
}
}
}
Jetzt können Sie iOS> 8 testen