顯示廣告
隱藏 ✕
看板 KnucklesNote
作者 Knuckles (站長 那克斯)
標題 [Xcode][Swift3] Alamofire 儲存 Cookies 資料
時間 2017-04-28 Fri. 22:22:27


參考 [Xcode][Swift3] 使用 Alamofire 存取網站資料 - KnucklesNote板 - Disp BBS
使用 Alamofire 存取網站時,
會將 Cookies 資料存在系統的 HTTPCookieStorage
下一次連線時會使用同樣的 Cookies 來連線
若是使用 WebView 載入網頁也會用相同的 Cookies

但若是將 App 強制關閉再重新打開後,
儲存的 Cookies 資料就會消失了

如果想要做保持帳號登入的功能,
可以將 Cookies 先使用 UserDefaults 存起來
重新開啟時再讀出來存進 HTTPCookieStorage


Alamofire 版本 4.4

在登入帳號的頁面,建立一個成員函數 saveCookies()
func saveCookies(response: DataResponse<Any>) {
    let headerFields = response.response?.allHeaderFields as! [String: String]
    let url = response.response?.url
    let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields, for: url!)
    var cookieArray = [[HTTPCookiePropertyKey: Any]]()
    for cookie in cookies {
        cookieArray.append(cookie.properties!)
    }
    UserDefaults.standard.set(cookieArray, forKey: "savedCookies")
    UserDefaults.standard.synchronize()
}
從網站的回應中讀取 Cookies 資料,
將 Cookies 轉為 Cookie 陣列,
存入 UserDefaults 的 "savedCookies"


使用 Alamofire 登入網站後,執行 saveCookies
Alamofire.request(urlString).responseJSON { response in
    saveCookies(response)
}


在 App 一開始的主頁面,建立一個成員函數 loadCookies()
func loadCookies() {
    guard let cookieArray = UserDefaults.standard.array(forKey: "savedCookies") as? [[HTTPCookiePropertyKey: Any]] else { return }
    for cookieProperties in cookieArray {
        if let cookie = HTTPCookie(properties: cookieProperties) {
            HTTPCookieStorage.shared.setCookie(cookie)
        }
    }
}
從 UserDefaults 中取出 Cookie 陣列
將每個 Cookie 分別存入 HTTPCookieStorage

只要執行一次 loadCookies() 即可
之後使用 Alamofire.request() 或是用 WebView 載入網頁時,
都會使用這組 Cookies 來連線了



--
※ 作者: Knuckles 時間: 2017-04-28 22:22:27
※ 編輯: Knuckles 時間: 2017-04-29 11:29:46
※ 看板: KnucklesNote 文章推薦值: 0 目前人氣: 0 累積人氣: 406 
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇