顯示廣告
隱藏 ✕
看板 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 累積人氣: 407 
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇
看板名稱: 確定(Enter) 取消(Esc) 搜尋(Space)
查詢帳號: 確定(Enter) 取消(Esc) 搜尋(Space)
搜尋: m)m文 b)進板 c)未分類 a)作者 /)標題 q)取消?[q]

搜尋 送出(Enter) 取消(Esc)

回覆文章至: f)看板 m)作者信箱 b)兩者皆是 q)取消?[f]
要引用原文嗎? y)引用原文 n)不引用 a)全部回覆 r)複製原文 q)取消?[y]
轉錄本文章於看板: 1)使用連結 2)使用複製 q)取消 ?[1]
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc) 全部(a)

確定要刪除這篇文章?(可按大U救回) 確定(Enter) 取消(Esc)

刪除理由:

確定(Enter) 取消(Esc)
加到這個分類: 確定(Enter) 下一層(→) 回上層(←) 取消(Esc)
你覺得這篇文章: 1)真讚 2)真瞎 q)取消?[1] (再選一次即可收回)
你覺得這篇文章: 1)值得推薦 2)表示反對 3)單純註解 q)取消?[3]
guest
預覽(Enter) 取消(Esc)
上傳圖片
按ctrl+Enter可輸入下一行。
guest
確定要送出? 確定(Enter) 取消(Esc) 繼續(e)
搜尋: 送出(Enter) 取消(Esc)

▏▎▍▌▋▊▉ 請按任意鍵繼續