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=/一定要加上,当初调试的时候因为这个问题花了很长时间才找到原因
iOS swift cookie创建存储移除的更多相关文章
- iOS - Swift SQLite 数据库存储
前言 采用 SQLite 数据库来存储数据.SQLite 作为一中小型数据库,应用 iOS 中,跟前三种保存方式相比,相对比较复杂一些. 注意:写入数据库,字符串可以采用 char 方式,而从数据库中 ...
- iOS - Swift PList 数据存储
前言 直接将数据写在代码里面,不是一种合理的做法.如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低.因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如 ...
- iOS - Swift NSUserDefaults 数据存储
前言 public class NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefault ...
- 在iOS中怎样创建可展开的Table View?(下)
接上篇:在iOS中怎样创建可展开的Table View?(上) 展开和合拢 我猜这部分可能是你最期望的了,因为本次教程的目标将会在在部分实现.第一次我们设法让顶层的cell,在它们点击的时候展开或者合 ...
- iOS开发:创建真机调试证书及描述文件
iOS开发:创建真机调试证书及描述文件 关于苹果iOS开发,笔者也是从小白过来的,经历过各种困难和坑,其中就有关于开发证书,生产证书,in_house证书,add_Hoc证书申请过程中的问题,以及上架 ...
- iOS的Cookie存取
当前一些公司为了快速出一款app,很多时候采用UINavigationController+WebView或者NavigationController+UITabbarVC+WebView的方式,这样 ...
- iOS中Cookie的管理
平常的app开发中只调用Rest Api可能用不到Cookie,但是当要在App中内嵌WebView就有可能要用到.最近用到了这一块的东西,总结一下. Cookie原理 关于cookie的原理简单描述 ...
- [Xcode 实际操作]一、博主领进门-(1)iOS项目的创建和项目模板的介绍
目录:[Swift]Xcode实际操作 本文将演示iOS项目的创建和项目模板的介绍. [Create a new Xcode project]创建一个新的项目. 在弹出的模板窗口中,显示了所有的项目模 ...
- Step by Step Do IOS Swift CoreData Simple Demo
简单介绍 这篇文章记录了在 IOS 中使用 Swift 操作 CoreData 的一些基础性内容,因为缺乏文档,基本上都是自行实验的结果.错漏不可避免,还请谅解. 部分内容借鉴了 Tim Roadle ...
随机推荐
- [HDU6252]Subway Chasing
题目大意: 一条直线上有n个点,两个人在直线上走,保持x的距离. 告诉你m条信息,告诉你一个人在ab之间时,另一个人在cd之间. 问这些信息是否矛盾,如果不矛盾,求相邻两点之间的最小距离. 思路: m ...
- 点击VS2010调试按钮无反应
使用vs打开网站的方式分为两种. 1) 点击“在浏览器中查看”无反应的话,就点击“浏览方式”,选择一个浏览器进行查看. 2)第二中是直接点击调试按钮,结果浏览器无反应. 以上两种方法不成功的原因都是浏 ...
- 使用urlretrieve下载图片
示例代码: from urllib.request import urlretrieve from urllib.request import urlopen from bs4 import Beau ...
- Spring.NET的IoC容器(The IoC container)——简介(Introduction)
简介 这个章节介绍了Spring Framework的控制反转(Inversion of Control ,IoC)的实现原理. Spring.Core 程序集是Spring.NET的 IoC 容器实 ...
- 如何让Ubuntu 14重启后,保存屏幕亮度的设置
每次重新启动后,系统的屏幕亮度都会被调节到最大值,挺烦人的!如何让它保存设置值呢? 首先,我们必须知道自己系统的屏幕亮度取值范围,打开终端,按照下面的步骤进行: 进入backlight这个目录 cd ...
- How to determine what causes a particular wait type
By: Paul Randal Posted on: March 18, 2014 6:55 pm [Edit 2016: Check out my new resource – a comp ...
- Delphi 设置时间格式
// 设置WINDOWS系统的短日期的格式SetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, 'yyyy-MM-dd'); Applicat ...
- 关于yum的一些安装问题
最近折腾CentOS和kubernetes,遇到一些安装问题,把和yum相关的逐步总结如下: 如何用本地的cdrom作为yum源 mount /dev/cdrom /mnt 先查询是否安装了creat ...
- 特征选取方法PCA与LDA
一.主成分分析(PCA)介绍 什么是主成分分析? 主成分分析是一种用于连续属性降维的方法,把多指标转化为少数几个综合指标. 它构造了原始属性的一个正交变换,将一组可能相关的变量转化为一组不相关的变 ...
- XSS跨站脚本测试用例
'><script>alert(document.cookie)</script>='><script>alert(document.cookie)&l ...