Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 482
Pedro Fernandes Avatar asked Oct 27 '25 03:10

Pedro Fernandes


2 Answers

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)
            }
        }
    }
like image 92
Kosuke Ogawa Avatar answered Oct 29 '25 19:10

Kosuke Ogawa


Here's the answer in Objective-C:

To save cookies:

NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:cookieJar.cookies];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:data forKey:@"Cookies"];

To load cookies:

NSData *data = [defaults objectForKey:@"Cookies"];
if (data) {
    NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    if (cookies) {
        for (NSHTTPCookie *cookie in cookies) {
            [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
        }
    }
}
like image 25
Marcus Adams Avatar answered Oct 29 '25 20:10

Marcus Adams