9

How to set Cookies in Alamofire such that such that every time I kill the app and restart it, the same cookie is sent?

Gaurav
  • 143
  • 1
  • 3
  • 10

5 Answers5

11

Swift 5.1 & Alamofire 5.0

Prepare your cookies

let cookieProps = [
    HTTPCookiePropertyKey.domain: "##put your domain here##",
    HTTPCookiePropertyKey.path: "/",
    HTTPCookiePropertyKey.name: "##put your cookie key here##",
    HTTPCookiePropertyKey.value: "##put your cookie value here##"
   ]

Set your cookies

if let cookie = HTTPCookie(properties: cookieProps) {
    AF.session.configuration.httpCookieStorage?.setCookie(cookie)
}

After that, you can do your normal request and the cookies will be sent to server

Alamofire.request(
  ##URL##,
  method: ##.post or .get##,
  parameters: parameters
  ).responseString {
    response in 
    ....
}

B25Dec
  • 2,301
  • 5
  • 31
  • 54
miraboma
  • 161
  • 2
  • 5
  • will the cookie be sent over even if domain of the url changes? in my case, i have to use a different domain for downloading larger files – Skywalker Feb 08 '21 at 07:53
6

Get cookies from response using the NSHTTPCookie [cookiesWithResponseHeaderFields(_:forURL:)] method.

// setCookies
 func setCookies(cookies: NSHTTPCookie){
     Alamofire.Manager.sharedInstance.session.configuration.HTTPCookieStorage?.setCookies(cookies, forURL: response.URL!, mainDocumentURL: nil)
 }

// getCookies
func getCookies() {
    let parameters: [String: AnyObject] = [:]

    Alamofire.request(.POST, "http://test.com/test", parameters: parameters).responseJSON { response in
        if let
            header = response.response?.allHeaderFields as? [String: String],
            URL = response.request?.URL
        {
            let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(header, forURL: URL)
            print(cookies)
        }
    }
}

Swift 3:

func setCookies(cookies: HTTPCookie){
    Alamofire.SessionManager.default.session.configuration.httpCookieStorage?.setCookies(cookies, forURL: URL, mainDocumentURL: nil)
}

Alamofire.request(url, method: HTTPMethod.post, parameters: parameters).responseData { (responseObject) -> Void in

                if let resposecode = responseObject.response?.statusCode {
                    if resposecode != 200 {
                        // error
                    } else {
                        // view all cookies
                        print(HTTPCookieStorage.shared.cookies)
                    }
                }
           }
melbic
  • 11,988
  • 5
  • 33
  • 37
Krunal
  • 77,632
  • 48
  • 245
  • 261
  • I want to set a default cookie every time I make a request, even when I close and restart the app, the cookie should be same. This was not I was looking for. – Gaurav May 15 '17 at 10:30
  • @krunal How does it store the cookie persistently, if it does? – Haywire May 15 '17 at 10:45
  • With every response, you need to get cookies, store in permanent/default storage (called NSUserDefaults). With every request get cookies from permanent storage and set with request. – Krunal May 15 '17 at 10:47
  • Is there an inbuilt way to manage this? Sort of a loadable session or something similar? – Haywire May 15 '17 at 10:51
5

Swift 3.0

let cookies = HTTPCookie.cookies(withResponseHeaderFields: response.allHeaderFields , for: response.URL!)

Alamofire.Manager.sharedInstance.session.configuration.HTTPCookieStorage?.setCookies(cookies, forURL: URL, mainDocumentURL: nil)

Alamofire instance is shared singleton, so for all Request the cookie is set. Hope it's works for you.

Jaydeep Vora
  • 6,085
  • 1
  • 22
  • 40
1

Like this?

let httpCookie = HTTPCookie.init(properties:
        [HTTPCookiePropertyKey.version : "0",
        HTTPCookiePropertyKey.name : "MYTestID",
        HTTPCookiePropertyKey.value : "983724dd3dea4924b8d675b0df08b611",
        HTTPCookiePropertyKey.expires : "2027-05-13 09:21:23 +0000"])
    if let cookie = httpCookie {
        HTTPCookieStorage.shared.setCookie(cookie)
    }
Tony
  • 59
  • 1
  • 5
0
if let fields = response.response?.allHeaderFields as? [String : String]{
            let cookies = HTTPCookie.cookies(withResponseHeaderFields: fields, for: (response.request?.url!)!)
            HTTPCookieStorage.shared.setCookies(cookies, for: (response.request?.url!)!, mainDocumentURL: nil)
        }
Hamed
  • 1,678
  • 18
  • 30