Are cookies in UIWebView accepted? Are cookies in UIWebView accepted? ios ios

Are cookies in UIWebView accepted?


The UIWebView will automatically store the cookies in the [NSHTTPCookieStorage sharedHTTPCookieStorage] collection, and should be available in all other UIWebViews within your app, during the same app launch. However the UIWebView class does not automatically store cookies for the pages that are loaded between app launches. You need to manually store cookies when the app is moved into the background and reload the values when the app is brought back into the foreground.

Place the following code in your AppDelegate class:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    //Other existing code    [self loadHTTPCookies];    return YES;}- (void)applicationDidEnterBackground:(UIApplication *)application{    //Other existing code    [self saveHTTPCookies];}- (void)applicationWillEnterForeground:(UIApplication *)application{    [self loadHTTPCookies];}- (void)applicationWillTerminate:(UIApplication *)application{    //Other existing code    [self saveHTTPCookies];}-(void)loadHTTPCookies{    NSMutableArray* cookieDictionary = [[NSUserDefaults standardUserDefaults] valueForKey:@"cookieArray"];    for (int i=0; i < cookieDictionary.count; i++)    {        NSMutableDictionary* cookieDictionary1 = [[NSUserDefaults standardUserDefaults] valueForKey:[cookieDictionary objectAtIndex:i]];        NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieDictionary1];        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];    }}-(void)saveHTTPCookies{    NSMutableArray *cookieArray = [[NSMutableArray alloc] init];    for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {        [cookieArray addObject:cookie.name];        NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];        [cookieProperties setObject:cookie.name forKey:NSHTTPCookieName];        [cookieProperties setObject:cookie.value forKey:NSHTTPCookieValue];        [cookieProperties setObject:cookie.domain forKey:NSHTTPCookieDomain];        [cookieProperties setObject:cookie.path forKey:NSHTTPCookiePath];        [cookieProperties setObject:[NSNumber numberWithUnsignedInteger:cookie.version] forKey:NSHTTPCookieVersion];        [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];        [[NSUserDefaults standardUserDefaults] setValue:cookieProperties forKey:cookie.name];        [[NSUserDefaults standardUserDefaults] synchronize];    }    [[NSUserDefaults standardUserDefaults] setValue:cookieArray forKey:@"cookieArray"];    [[NSUserDefaults standardUserDefaults] synchronize];}


Expanding the other answers:

Since NSHTTPCookieStorage cookies can be archived using NSKeyedArchiver, you don't need to extract every single cookie property yourself. Furthermore, you will want to remove the NSUserDefaults cookie property, when there are no cookies to store.

So you can simplify your cookie storing/loading to this extension:

static NSString *const kCookiesKey = @"cookies";@implementation NSHTTPCookieStorage (Persistence)- (void)saveToUserDefaults{    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];    if (self.cookies != nil && self.cookies.count > 0) {        NSData *cookieData = [NSKeyedArchiver archivedDataWithRootObject:self.cookies];        [userDefaults setObject:cookieData forKey:kCookiesKey];    } else {        [userDefaults removeObjectForKey:kCookiesKey];    }    [userDefaults synchronize];}- (void)loadFromUserDefaults{    NSData *cookieData = [[NSUserDefaults standardUserDefaults] objectForKey:kCookiesKey];    if (cookieData != nil) {        NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:cookieData];        for (NSHTTPCookie *cookie in cookies) {            [self setCookie:cookie];        }    }}@end

Then just use [[NSHTTPCookieStorage sharedHTTPCookieStorage] loadFromUserDefaults]; and [[NSHTTPCookieStorage sharedHTTPCookieStorage] saveToUserDefaults]; in your AppDelegate as mentioned above.


swift 3 clear version

func saveCookies() {    guard let cookies = HTTPCookieStorage.shared.cookies else {        return    }    let array = cookies.flatMap { (cookie) -> [HTTPCookiePropertyKey: Any]? in        cookie.properties    }    UserDefaults.standard.set(array, forKey: "cookies")    UserDefaults.standard.synchronize()}func loadCookies() {    guard let cookies = UserDefaults.standard.value(forKey: "cookies") as? [[HTTPCookiePropertyKey: Any]] else {        return    }    cookies.forEach { (cookie) in        guard let cookie = HTTPCookie.init(properties: cookie) else {            return        }        HTTPCookieStorage.shared.setCookie(cookie)    }}