項目上需要將服務(wù)器返回的cookie上的sid項保存到本地用于維護(hù)一個長登陸狀態(tài)
網(wǎng)上獲取Cookie的方法一般是這樣的
let cookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
var sid: String?
let cookieArray = cookieStorage.cookies
for cookie in cookieArray {
if cookie.name == "sid" {
//獲取cookie的sid對應(yīng)的值
sid = cookie.value
break
}
}
但是cookie數(shù)組里含有name為sid的會有多項,這樣無法精確獲取一個cookie,后來知道NSHTTPURLResponse里有一項allHeaderFields屬性,allHeaderFields是一個[string:AnyObject]類型的字典,里面是原始Http響應(yīng)頭部,打印一下,
[Server: nginx, Set-Cookie: sid=6udoy4al4bk8vk8qr0x0jq6oninx9f8f; expires=Mon, 07-Aug-2017 08:41:58 GMT; Max-Age=31536000; path=/, Content-Type: application/json, Transfer-Encoding: Identity, Proxy-Connection: Keep-alive, Date: Sun, 07 Aug 2016 08:41:58 GMT, Content-Encoding: gzip, Vary: Accept-Encoding]
里面有一項"Set-Cookie",是一個字符串
Set-Cookie: sid=6udoy4al4bk8vk8qr0x0jq6oninx9f8f; expires=Mon, 07-Aug-2017 08:41:58 GMT; Max-Age=31536000; path=/
這樣我們就可以寫個函數(shù)截取這個sid的內(nèi)容了
隨手寫了
//對應(yīng)上面的打印內(nèi)容 cookieStr為"sid=6udoy4al4bk8vk8qr0x0jq6oninx9f8f; expires=Mon, 07-Aug-2017 08:41:58 GMT; Max-Age=31536000; path=/"
//name為"sid"
class func getSetCookieOneContentWithName(cookieStr: String,name:String) -> String {
let cookieTempStr = cookieStr as NSString
if cookieTempStr.containsString(name) == false
{
return ""
}
let range = cookieTempStr.rangeOfString(name)
//加1是等號
let contentStart = range.location+range.length+1
var length = 0
for i in contentStart..<cookieTempStr.length {
let str = cookieTempStr.substringWithRange(NSRange.init(location: i, length: 1))
if str != ";" {
length += 1
}
else {
break
}
}
let contentRange = NSRange.init(location: contentStart, length: length)
return cookieTempStr.substringWithRange(contentRange)
}
好啦,這樣就可以準(zhǔn)確獲得一個網(wǎng)絡(luò)請求回調(diào)的cookie啦