La raison derrière la publication de cette réponse est que j'ai essayé de nombreuses solutions mais personne ne fonctionne correctement, la plupart de la réponse ne fonctionne pas dans le cas où vous devez définir un cookie pour la première fois et que le cookie de résultat ne se synchronise pas la première fois, veuillez utiliser cette solution, cela fonctionne pour les deux iOS> = 11.0 <= iOS 11 à 8.0, fonctionne également avec la synchronisation des cookies pour la première fois.
Pour iOS> = 11,0
- Swift 4.2
Obtenez des cookies http et définissez-les dans le magasin de cookies wkwebview de cette manière, il est très difficile de charger votre demande dans wkwebview , vous devez envoyer une demande de chargement lorsque les cookies seront complètement définis, voici la fonction que j'ai écrite.
Appelez la fonction avec la fermeture à la fin que vous appelez load webview. Pour info, cette fonction ne gère que iOS> = 11.0
self.WwebView.syncCookies {
if let request = self.request {
self.WwebView.load(request)
}
}
Voici l'implémentation de la fonction 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()
}
}
Pour iOS 8 à iOS 11
vous devez configurer certaines choses supplémentaires dont vous avez besoin pour définir deux cookies temporels un en utilisant WKUserScript et n'oubliez pas d'ajouter également des cookies dans la demande, sinon votre cookie ne se synchronise pas la première fois et vous verrez que votre page ne se charge pas correctement la première fois. c'est le diable que j'ai trouvé pour prendre en charge les cookies pour iOS 8.0
avant de créer un objet 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))
}
Focus sur cette fonction 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
}
Voici une autre étape wkuserscript ne synchronise pas les cookies immédiatement, il y a beaucoup de mal à charger la première page avec le cookie, l'un est de recharger à nouveau la vue Web si elle met fin au processus mais je ne recommande pas de l'utiliser, ce n'est pas bon pour le point de vue de l'utilisateur , diable est que chaque fois que vous êtes prêt à charger des cookies de demande dans l'en-tête de la demande, n'oubliez pas d'ajouter la vérification de la version iOS. avant la demande de chargement, appelez cette fonction.
request?.addCookies()
j'ai écrit une extension pour 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
}
}
}
}
vous êtes maintenant prêt à tester iOS> 8