保存网络请求的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. 金融应用,计算将来的学费 Exercise05_07

    /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:金融应用,计算将来的学费 * */ public class Exercise05_07 { public static vo ...

  2. Scala实战高手****第15课:Scala类型参数编程实战及Spark源码鉴赏

    1.Scala的类和方法.函数都可以是泛型 2.上界:表示泛型的类型必须是某种类型或者其类型的子类,语法:<: ,对类型进行限定 3.下界:表示泛型的类型必须是某种类型或者其类型的父类,语法:& ...

  3. 看懂ios命名规则

    http://liangrui.blog.51cto.com/1510945/509289/ http://daniellee520.blog.51cto.com/372529/229615

  4. Linux FTP配置

    Linux下实现ftp的软件有很多,最常见的有vsftpd,Wu-ftpd和proftp等.访问ftp服务器时需要验证,只有经过了ftp服务器的验证用户才能访问和传输文件.这里我们用vsftpd,vs ...

  5. 一起來玩鳥 Starling Framework(7)MovieClip

    承上一篇,我們接著來講最後一個IAnimatable類別,MovieClip.Starling的MovieClip跟native的MovieClip不太一樣,它只能接收一個Vector.<Tex ...

  6. Java笔记6:多态

    一.多态的分类对象的多态性:动物 x = new 猫();函数的多态性:函数重载.重写 二.多态的体现父类的引用指向了自己的子类对象父类的引用也可以接收自己的对象 三.多态的前提必须是类与类之间只有关 ...

  7. Hadoop之Azkaban详解

    工作流调度器azkaban1 为什么需要工作流调度系统 1)一个完整的数据分析系统通常都是由大量任务单元组成:shell脚本程序,java程序,mapreduce程序.hive脚本等 2)各任务单元之 ...

  8. javascript 的事件绑定和取消事件

    研究fabricjs中发现,它提供canvas.on('mousemove', hh) 来绑定事件, 提供 canvas.off()来取消绑定事件这样的接口,很是方便, 那我们就不妨探究一下内在的实现 ...

  9. Spring boot 数据源未配置异常

    问题 在使Springboot自动生成的项目框架时如果选择了数据源,比如选择了mysql,生成项目之后,启动会报一下异常: Description: Cannot determine embedded ...

  10. Invalid code signing entitlements. Your application bundle's signature contains

    http://code4app.com/requirement/54128041933bf0e0308b5204 Invalid code signing entitlements. Your app ...