/WKWebView

WKWebView添加cookie方法,自己亲测可用

WKWebView

WKWebView添加cookie方法,自己亲测可用

      // 可以创建多个cookie ,注意,这里cookie一定要创建完整的,越完整越好,切记,只设name 和 value是没用的
     let cookie = HTTPCookie(properties: [HTTPCookiePropertyKey.name : "ga",
                                         HTTPCookiePropertyKey.value: "\(LBConfiguration.enviroment == .Gray ? 1 : 0)",
                                         HTTPCookiePropertyKey.domain: ".aaaaaa.com",
                                         HTTPCookiePropertyKey.path: "/",
                                         HTTPCookiePropertyKey.version: 0,
                                         HTTPCookiePropertyKey.expires: Date(timeIntervalSinceNow: 60*60*24*99)])

    let cookie2 = HTTPCookie(properties: [HTTPCookiePropertyKey.name : "ga",
                                          HTTPCookiePropertyKey.value: "\(LBConfiguration.enviroment == .Gray ? 1 : 0)",
                                          HTTPCookiePropertyKey.domain: ".bbbbbb.com",
                                          HTTPCookiePropertyKey.path: "/",
                                          HTTPCookiePropertyKey.version: 0,
                                          HTTPCookiePropertyKey.expires: Date(timeIntervalSinceNow: 60*60*24*99)])
    // 这里实际上是清理已存在的旧cookie,这一步不做,老的cookie可能会影响新的cookie,现在测试来看,不清也没问题
    if let oldCookies = HTTPCookieStorage.shared.cookies {
        for ck in oldCookies {
            if ck.name == "ga" {
                HTTPCookieStorage.shared.deleteCookie(ck)
            }
        }
        // 这里仅仅是用来查看是否已清掉老的cookie
        if let temCookies = HTTPCookieStorage.shared.cookies {
            for ck in temCookies {
                print("cookie = ",ck.name)
            }
        }
    }
      
    if #available(iOS 11.0, *) {
       // iOS11 之后苹果给了API,就不用那么麻烦了,直接先设cookie,再在回调里加载,我这里调二次,是因为工程可能有两个或更多的主域名,如果只有一个域名,就不用这样做了
        mainWeb.configuration.websiteDataStore.httpCookieStore.setCookie(cookie!) { [weak self] in
            self?.mainWeb.configuration.websiteDataStore.httpCookieStore.setCookie(cookie2!) {
                //这里特别要留意,request一定要在回调内创建,不然会有问题,切记
                let request = URLRequest(url: URL(string: urlstr)!)
                self?.mainWeb.load(request)
            }
        }
    } else {
              // 这里要注意了,如果你是单域名,只需要setValue一次就行,这里之所以这样做,是为了解决第一次请求时没有设上cookie的问题
              var request = URLRequest(url: URL(string: "http://xx.aaaaaa.com/xxxxxx")!)
              request.setValue(getCookieString(cookie!), forHTTPHeaderField: "Cookie")
              request.setValue(getCookieString(cookie2!), forHTTPHeaderField: "Cookie")
              // 这里作用是通过js注入的方式把cookie种到本地,之后就会一直有了
              let cookieScript = WKUserScript(source: "document.cookie = '\(getCookieString(cookie!))';document.cookie = '\(getCookieString(cookie2!))';", injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: false)
              mainWeb.configuration.userContentController.addUserScript(cookieScript)
              mainWeb.load(request)
    }
    
    // cookie转换成字符串,方便写入,
    func getCookieString(_ cookie:HTTPCookie) -> String {
        let str = "\(cookie.name)=\(cookie.value);domain=\(cookie.domain);expiresDate=\(cookie.expiresDate ?? Date(timeIntervalSinceNow: 60*60*24*99));path=\(cookie.path);sessionOnly=\(cookie.isSessionOnly ? "TRUE":"FALSE");isSecure=\(cookie.isSecure ? "TRUE":"FALSE")"
        return str
    }