保存网络请求的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=/一定要加上,当初调试的时候因为这个问题花了很长时间才找到原因

iOS swift cookie创建存储移除的更多相关文章

  1. iOS - Swift SQLite 数据库存储

    前言 采用 SQLite 数据库来存储数据.SQLite 作为一中小型数据库,应用 iOS 中,跟前三种保存方式相比,相对比较复杂一些. 注意:写入数据库,字符串可以采用 char 方式,而从数据库中 ...

  2. iOS - Swift PList 数据存储

    前言 直接将数据写在代码里面,不是一种合理的做法.如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低.因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如 ...

  3. iOS - Swift NSUserDefaults 数据存储

    前言 public class NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefault ...

  4. 在iOS中怎样创建可展开的Table View?(下)

    接上篇:在iOS中怎样创建可展开的Table View?(上) 展开和合拢 我猜这部分可能是你最期望的了,因为本次教程的目标将会在在部分实现.第一次我们设法让顶层的cell,在它们点击的时候展开或者合 ...

  5. iOS开发:创建真机调试证书及描述文件

    iOS开发:创建真机调试证书及描述文件 关于苹果iOS开发,笔者也是从小白过来的,经历过各种困难和坑,其中就有关于开发证书,生产证书,in_house证书,add_Hoc证书申请过程中的问题,以及上架 ...

  6. iOS的Cookie存取

    当前一些公司为了快速出一款app,很多时候采用UINavigationController+WebView或者NavigationController+UITabbarVC+WebView的方式,这样 ...

  7. iOS中Cookie的管理

    平常的app开发中只调用Rest Api可能用不到Cookie,但是当要在App中内嵌WebView就有可能要用到.最近用到了这一块的东西,总结一下. Cookie原理 关于cookie的原理简单描述 ...

  8. [Xcode 实际操作]一、博主领进门-(1)iOS项目的创建和项目模板的介绍

    目录:[Swift]Xcode实际操作 本文将演示iOS项目的创建和项目模板的介绍. [Create a new Xcode project]创建一个新的项目. 在弹出的模板窗口中,显示了所有的项目模 ...

  9. Step by Step Do IOS Swift CoreData Simple Demo

    简单介绍 这篇文章记录了在 IOS 中使用 Swift 操作 CoreData 的一些基础性内容,因为缺乏文档,基本上都是自行实验的结果.错漏不可避免,还请谅解. 部分内容借鉴了 Tim Roadle ...

随机推荐

  1. 使用IDEA创建package

    1)使用IDEA创建java工程 什么也不选,直接点击Next 无脑继续下一步 点击“Finish”完成工程的创建. 2)在使用IDEA创建了工程之后,首先选中“src”文件夹,然后 紧接着输入包名 ...

  2. IOS,苹果内购和添加广告

    内购——应用内购买 通过苹果应用程序商店有三种主要赚钱的方式: 直接收费(与国内大部分用户的消费习惯相悖) 广告(降低用户体验 应用程序名称带Lite可以添加广告) O2O -> Online推 ...

  3. JQuery使用trigger模拟触发selete的选择change事件

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  4. Word中插入带公式的Visio注意事项

    有时候发现,有的公式显示的间距特别大,那么在word中右键打开Visio,改好后,保存了,word里还是那样. 因为你需要吧改好的另存为原来的visio文件(名字.位置要一样,就是说替换原来的文件), ...

  5. nhibernate change connection

    http://stackoverflow.com/questions/4335827/changing-nhibernate-connectionstring http://stackoverflow ...

  6. lsof/fuser卸载挂载文件

    Linux如何卸载挂载文件   在我们进行远程文件操作的时候,我们经常会出现文件服务出现卸载掉哦情况.例如 umount /mnt/net1umount: /mnt/net1: device is b ...

  7. GraphicsLab Project之辉光(Glare,Glow)效果 【转】

    作者:i_dovelemon 日期:2016 / 07 / 02 来源:CSDN 主题:Render to Texture, Post process, Glare, Glow, Multi-pass ...

  8. artDialog弹出框使用

    配置参数 名称 类型 默认值 描述 内容 title String '消息' 标题内容 content String 'loading..' 消息内容.1.如果传入的是HTMLElement类型,如果 ...

  9. 一起來玩鳥 Starling Framework(3)Button!

    週末夜來介紹個簡單的DisplayObject就好.不論是在電腦上或行動裝置上,跟使用者互動次數最多的,大概就是按鈕了.因此,Starling有個Button類別,來做出這個常用的互動元件. 同樣是因 ...

  10. solr curl索引 CSV/Json/xml文件

    在windows系统中,用curl命令工具索引文件命令: 启动solr 在solr-6.6.0\bin的同级目录下的文件夹ImportData下要索引的文件. 1.索引 json文件 curl &qu ...