Search code examples
iosswiftcookiesuiwebview

UIWebView: Save cookie state across app restarts


I developing an application with Swift and an UIWebView that opens a webapp. Each time our users open the app, they need to login again because the app is not storing cookies. How can i solve it?

I tried this to store cookies:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {

    println(request.URL!.absoluteString)


    var cookiesData = NSKeyedArchiver.archivedDataWithRootObject(NSHTTPCookieStorage.sharedHTTPCookieStorage().cookies!)

    NSUserDefaults.standardUserDefaults().setObject(cookiesData, forKey: "savedCookies")

    return true
}

And to retrieve cookies again:

NSHTTPCookieStorage.sharedHTTPCookieStorage().cookieAcceptPolicy = NSHTTPCookieAcceptPolicy.Always
let cookies = NSKeyedUnarchiver.unarchiveObjectWithData(NSUserDefaults.standardUserDefaults().objectForKey("cookies"))

I don't know how can i retrieve cookies in an array and iterate them.


Solution

  • Try this code:

    To save cookie

        let cookieJar: NSHTTPCookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
        let data: NSData = NSKeyedArchiver.archivedDataWithRootObject(cookieJar.cookies)
        let ud: NSUserDefaults = NSUserDefaults.standardUserDefaults()
        ud.setObject(data, forKey: "cookie")
    

    To retrieve cookie

        let ud: NSUserDefaults = NSUserDefaults.standardUserDefaults()
        let data: NSData? = ud.objectForKey("cookie") as? NSData
        if let cookie = data {
            let datas: NSArray? = NSKeyedUnarchiver.unarchiveObjectWithData(cookie) as? NSArray
            if let cookies = datas {
                for c in cookies as! [NSHTTPCookie] {
                    NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookie(c)
                }
            }
        }