Cookie,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265 。简单来说就是你帮你储存了密码,用一个标识符确定是你请求的,不用每次操作都输入密码。
在未搞懂之前绝对是一号大麻烦,因为Cookie是存在内存的,也就是只运行期间存在,在调试过程中,无论Xcode关闭重装App还是手动关闭App,再次进入进行用户操作都需要再次登录。
一开始以为是Alarmfire没有附加之前的本地的Cookie的原因,我就打印了每次请求后的头部信息,看看Cookie是否真的有,一开始打印的有Cookie,而且是两个,这样也没什么我可以取出第一个来,我想着既然这样,那我登录专门写个单独处理的接口来记录Cookie,在每次需要Cookie的地方传入这个Cookie就可以了。
但是,但是,当我单独写完登陆的这个接口调用的时候出错了,和之前一样的问题。于是,我重新打印了请求,发现之前的有两个Cookie的只显示了最后一个,之前的直接没显示,把我气晕了,哪会像这样子的,要么就全有吗,给我来个覆盖。。。 我好气哦,他们安卓都不会这样。于是我又想了一个方法,会不会是Alarmfire对这个请求返回的头部做了其他特殊处理,当时看了源码,并没有发现疑似特殊的处理。我又用系统请求URLSession来写个登录接口,写着看着能解决肯定高兴,不出意外,这个Cookie又成功的让我在电脑前深思。。。
打开了百度,搜索一波发现和之前搜的结果一样,总希望能找到一个有用的发子,看到一个和我问题一模一样,他的做法是把系统存储Cookie的HTTPCookieStorage里的Cookie数组保存持久化,程序再次启动的时候再次加载进内存里,理论上是可以的,事实在我这里是不可以的,于是既然可以获取到内存中已存在的Cookie,那我为何不把他给拎出来呢,我就打印了,果然发现有两个Cookie,两个都有,于是我把那个用作验证的PHPSESSID给取出来,后来想到如果后续加入的其他验证不是本网的,再同域名进行匹配,把他给持久化储存,要用的时候取出来就可以。
可以在其他请求里加入如果服务器返回需要登录,则直接弹出登录界面。 这个结尾有点长,但是结果还是挺不错的,让我知道好多问题应该往根源去看,而不是一味的寻找答案.
let cookieArray = HTTPCookieStorage.shared.cookies!
let cookieIndex = cookieArray.index(where: { (cookie) -> Bool in
return cookie.name == "PHPSESSID" && cookie.domain == "www.xxxx.com"
})
if cookieIndex != nil {
let cookie = "PHPSESSID=\(cookieArray[cookieIndex!].value)"
///存储Cookie到本地
UserDefault.shared.setCookie(with: cookie)
}
网友评论