zoukankan      html  css  js  c++  java
  • iOS swift cookie创建存储移除

    保存网络请求的cookies,并存储到UserDefaults中

        //保存COOKIES
        static func saveCookies(for urlStr: String){
            if let url = URL(string: urlStr){
                if let cookies = HTTPCookieStorage.shared.cookies(for: url){
                    var JSESSIONID = ""
                    for cookie in cookies {
                            if cookie.name == "SESSION"{
                            JSESSIONID = cookie.value
                            break
                        }
                    }
                    if JSESSIONID.count > 0 {
                        let defaults = UserDefaults.standard
                        defaults.set(JSESSIONID, forKey: "SESSIONID")
                        defaults.synchronize()
                    }
                }
            }
        }
        //如果是登录成功一般还需要
        func saveLoginCookie(_ urlStr: String){
            let str = HOST_API + urlStr
            if let url = URL(string: str) {
               let cookies = HTTPCookieStorage.shared.cookies(for: url)
                //将cookies转换成Data
                let data = NSKeyedArchiver.archivedData(withRootObject: cookies as Any)
                //将data存储到userDefaults中
                UserDefaults.standard.set(data, forKey: HXQUserCookie)
            }
        }
    

    发起网络请求时,获取已经保存的cookies

        static func getCookies(){
            let defaults = UserDefaults.standard
            let JSESSIONID = defaults.value(forKey: "SESSIONID") as? String
            var TOKEN = ""
            //登录成功TOKEN
            if let cookieData = defaults.value(forKey: HXQUserCookie) as? Data{
                if cookieData.count > 0{
                    if let cookies = NSKeyedUnarchiver.unarchiveObject(with: cookieData) as? Array<HTTPCookie>{
                        for cookie in cookies {
                            if cookie.name == "TOKEN"{
                                TOKEN = cookie.value
                                break
                            }
                        }
                    }
                }
            }
            
            if TOKEN.count > 0 && JSESSIONID != nil {
                
                if let sessionCookie = HTTPCookie(properties: creatHTTPCookie("SESSIONID", vlaue: JSESSIONID!)) {
                    HTTPCookieStorage.shared.setCookie(sessionCookie)
                }
                
                if let tokenCookie = HTTPCookie(properties: creatHTTPCookie("TOKEN", vlaue: TOKEN)) {
                    HTTPCookieStorage.shared.setCookie(tokenCookie)
                }
            }
        }
    
        static func creatHTTPCookie(_ key: String, vlaue: String) -> [HTTPCookiePropertyKey : Any] {
            // 定义一个可变字典存放cookie键值对
            var properties: [HTTPCookiePropertyKey : Any] = [:]
            properties[.name] = key
            properties[.path] = "/"
            properties[.value] = vlaue
            properties[.secure] = true
            #if DEBUG
            let domain = "cs.hxquan.cn"
            #else
            let domain = "m.hxquan.cn"
            #endif
            properties[.domain] = domain
            properties[.version] = 0
            return properties
        }
    

    这里创建cookie的时候需要特别注意,swift中cookie创建 HTTPCookie(properties: [HTTPCookiePropertyKey : Any]),需要 [HTTPCookiePropertyKey : Any]这种格式的字典,不像oc中那么直接的键值对,cookie中的name,path,value,secure,domain,version等字段都必须要有,oc中不需要。

    移除保存的cookies

        static func removeCookies(){
            if let cookies = HTTPCookieStorage.shared.cookies{
                //移除cookies
                for cookie in cookies {
                    HTTPCookieStorage.shared.deleteCookie(cookie)
                }
            }
            //移除userDefaults数据
            let defaults = UserDefaults.standard
            defaults.removeObject(forKey: HXQUserCookie)
            defaults.removeObject(forKey: "SESSIONID")
            defaults.synchronize()
        }
    

    针对wkwebView的cookie的操作:
    wkwebView在访问的时候如果需要记录用户的操作,也需要传入cookie,但是wkWebView不能直接通过HTTPCookieStorage来访问cookie,需要把cookie存放在WKUserScript中

        lazy var webView: WKWebView = {[weak self] in
            let config = WKWebViewConfiguration()
            config.userContentController = WKUserContentController()
            //允许内嵌video播放
            config.allowsInlineMediaPlayback = true
            config.userContentController.add(WeakScriptMessageDelegate(scriptDelegate: self!), name: HxqWebHandleName)
            
            let defaults = UserDefaults.standard
            var cookieDict = [String:String]()
            if let SESSIONID = defaults.value(forKey: "SESSIONID") as? String{
                cookieDict["SESSIONID"] = SESSIONID
            }
            if let cookiesData = defaults.value(forKey: HXQUserCookie) as? Data{
                if  let cookies = NSKeyedUnarchiver.unarchiveObject(with: cookiesData) as? Array<HTTPCookie> {
                    for cookie in cookies{
                        if cookie.name == "TOKEN"{
                            cookieDict["SESSIONID"] = cookie.value
                            break
                        }
                    }
                }
            }
            if cookieDict.keys.count == 2{
                let cookieScript = WKUserScript(source: "document.cookie = 'TOKEN=(cookieDict["TOKEN"]!);path=/';document.cookie = 'SESSIONID=(cookieDict["SESSIONID"]!);path=/'", injectionTime: .atDocumentStart, forMainFrameOnly: false)
                config.userContentController.addUserScript(cookieScript)
            }
            let webView = WKWebView(frame: .zero, configuration: config)
            webView.uiDelegate = self
            webView.navigationDelegate = self
            return webView
        }()
    

    这里也有一个地方需要注意的document.cookie = 'TOKEN=(cookieDict["TOKEN"]!);path=/'',这里的path=/一定要加上,当初调试的时候因为这个问题花了很长时间才找到原因

  • 相关阅读:
    整数数组的组合问题
    C++ 虚函数与纯虚函数 浅析
    NetBeans 8.0 连接远程服务器
    R语言画图教程之盒形图
    R语言建立回归分析,并利用VIF查看共线性问题的例子
    R语言建立回归分析,并利用VIF查看共线性问题的例子
    Python技巧—list与字符串互相转换
    Python技巧—list与字符串互相转换
    sas正则式之prxparen
    sas正则式之prxparen
  • 原文地址:https://www.cnblogs.com/qqcc1388/p/9930034.html
Copyright © 2011-2022 走看看