UIWebView中的cookie被接受了吗?

我不得不为你质疑。

1:我在iPhone应用程序中使用UIWebView 。 我不希望用户能够在新闻中添加评论。 但是,要发表评论,他们必须login。

如果没有,我怎样才能在UIWebView接受cookie?

2: UIWebView创build的Cookie是否可用于其他视图中的其他UIWebView

例如:我有我的LoginViewController ,embedded了UIWebView ,我的用户可以login/注销。 如果他们在这个视图中login,Cookie将仍然在CommentViewController可用?

如果没有,我怎么能做到这一点?

提前致谢 !

UIWebView会自动将Cookie存储在[NSHTTPCookieStorage sharedHTTPCookieStorage]集合中,并且应用程序启动期间应该可以在您的应用程序中的所有其他UIWebView中使用。 但是, UIWebView类不会自动为在应用程序启动之间加载的页面存储Cookie。 当应用程序移动到后台时,您需要手动存储Cookie,并在应用程序返回到前台时重新加载值。

将下面的代码放在你的AppDelegate类中:

 - (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]; } 

扩大其他答案:

由于NSHTTPCookieStorage cookies可以使用NSKeyedArchiver进行存档,因此您不需要自己提取每个cookie属性。 此外,当没有要存储的cookie时,您将要删除NSUserDefaults cookie属性。

所以你可以简化你的cookie的存储/加载到这个扩展:

 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 

然后,只需使用[[NSHTTPCookieStorage sharedHTTPCookieStorage] loadFromUserDefaults];[[NSHTTPCookieStorage sharedHTTPCookieStorage] saveToUserDefaults]; 在你的AppDelegate如上所述。

迅捷3清晰版本

 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) } } 

Swift 3

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any] ? ) - > Bool { loadHTTPCookies() return true } func applicationDidEnterBackground(_ application: UIApplication) { saveCookies() } func applicationWillEnterForeground(_ application: UIApplication) { loadHTTPCookies() } func applicationWillTerminate(_ application: UIApplication) { saveCookies() } func loadHTTPCookies() { if let cookieDict = UserDefaults.standard.value(forKey: "cookieArray") as? NSMutableArray { for c in cookieDict { let cookies = UserDefaults.standard.value(forKey: c as!String) as!NSDictionary let cookie = HTTPCookie(properties: cookies as![HTTPCookiePropertyKey: Any]) HTTPCookieStorage.shared.setCookie(cookie!) } } } func saveCookies() { let cookieArray = NSMutableArray() if let savedC = HTTPCookieStorage.shared.cookies { for c: HTTPCookie in savedC { let cookieProps = NSMutableDictionary() cookieArray.add(c.name) cookieProps.setValue(c.name, forKey: HTTPCookiePropertyKey.name.rawValue) cookieProps.setValue(c.value, forKey: HTTPCookiePropertyKey.value.rawValue) cookieProps.setValue(c.domain, forKey: HTTPCookiePropertyKey.domain.rawValue) cookieProps.setValue(c.path, forKey: HTTPCookiePropertyKey.path.rawValue) cookieProps.setValue(c.version, forKey: HTTPCookiePropertyKey.version.rawValue) cookieProps.setValue(NSDate().addingTimeInterval(2629743), forKey: HTTPCookiePropertyKey.expires.rawValue) UserDefaults.standard.setValue(cookieProps, forKey: c.name) UserDefaults.standard.synchronize() } } UserDefaults.standard.setValue(cookieArray, forKey: "cookieArray") } 

这是一个更清洁,更安全的Swift版本:

 private func loadCookies() { guard let cookies = NSUserDefaults.standardUserDefaults().valueForKey("cookies") as? [[String: AnyObject]] else { return } for cookieProperties in cookies { if let cookie = NSHTTPCookie(properties: cookieProperties) { NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookie(cookie) } } } private func saveCookies() { guard let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookies else { return } var array = [[String: AnyObject]]() for cookie in cookies { if let properties = cookie.properties { array.append(properties) } } NSUserDefaults.standardUserDefaults().setValue(array, forKey: "cookies") NSUserDefaults.standardUserDefaults().synchronize() } 

从这个问题的所有伟大的其他答案我编译了一个方便的扩展UserDefaults ,缩短了必要的代码。

UserDefaults扩展Swift 3

 extension UserDefaults { /// A dictionary of properties representing a cookie. typealias CookieProperties = [HTTPCookiePropertyKey: Any] /// The `UserDefaults` key for accessing cookies. private static let cookieKey = "cookies" /// Saves all cookies currently in the shared `HTTPCookieStorage` to the shared `UserDefaults`. func saveCookies() { guard let cookies = HTTPCookieStorage.shared.cookies else { return } let cookiePropertiesArray = cookies.flatMap { $0.properties } set(cookiePropertiesArray, forKey: UserDefaults.cookieKey) synchronize() } /// Loads all cookies stored in the shared `UserDefaults` and adds them to the current shared `HTTPCookieStorage`. func loadCoookies() { let cookiePropertiesArray = value(forKey: UserDefaults.cookieKey) as? [CookieProperties] cookiePropertiesArray?.forEach { if let cookie = HTTPCookie(properties: $0) { HTTPCookieStorage.shared.setCookie(cookie) } } } } 

您可以将此代码添加到单独的文件UserDefaults+Cookies.swift (例如),然后调用您的AppDelegate的方法,如Brian Shamblen在其原始答案中所述 :

来自AppDelegate的呼叫

 func applicationDidBecomeActive(_ application: UIApplication) { UserDefaults.standard.loadCoookies() } func applicationWillEnterForeground(_ application: UIApplication) { UserDefaults.standard.loadCoookies() } func applicationDidEnterBackground(_ application: UIApplication) { UserDefaults.standard.saveCookies() } func applicationWillTerminate(_ application: UIApplication) { UserDefaults.standard.saveCookies() } 

Swift 2.0版本

 func loadCookies() { let cookieDict : NSMutableArray? = NSUserDefaults.standardUserDefaults().valueForKey("cookieArray") as? NSMutableArray if cookieDict != nil { for var c in cookieDict! { let cookies = NSUserDefaults.standardUserDefaults().valueForKey(c as! String) as! NSDictionary let cookie = NSHTTPCookie(properties: cookies as! [String : AnyObject]) NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookie(cookie!) } } } func saveCookies() { var cookieArray = NSMutableArray() let savedC = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookies for var c : NSHTTPCookie in savedC! { var cookieProps = NSMutableDictionary() cookieArray.addObject(c.name) cookieProps.setValue(c.name, forKey: NSHTTPCookieName) cookieProps.setValue(c.value, forKey: NSHTTPCookieValue) cookieProps.setValue(c.domain, forKey: NSHTTPCookieDomain) cookieProps.setValue(c.path, forKey: NSHTTPCookiePath) cookieProps.setValue(c.version, forKey: NSHTTPCookieVersion) cookieProps.setValue(NSDate().dateByAddingTimeInterval(2629743), forKey: NSHTTPCookieExpires) NSUserDefaults.standardUserDefaults().setValue(cookieProps, forKey: c.name) NSUserDefaults.standardUserDefaults().synchronize() } NSUserDefaults.standardUserDefaults().setValue(cookieArray, forKey: "cookieArray") }