UIWebView:在应用重新启动时保存 cookie 状态
UIWebView: Save cookie state across app restarts
我用 Swift 和一个打开 Web 应用程序的 UIWebView 开发了一个应用程序。
每次我们的用户打开该应用程序时,他们都需要重新登录,因为该应用程序不存储 cookie。我该如何解决?
我试过这个来存储 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
}
并再次检索 cookie:
NSHTTPCookieStorage.sharedHTTPCookieStorage().cookieAcceptPolicy = NSHTTPCookieAcceptPolicy.Always
let cookies = NSKeyedUnarchiver.unarchiveObjectWithData(NSUserDefaults.standardUserDefaults().objectForKey("cookies"))
我不知道如何在数组中检索 cookie 并迭代它们。
试试这个代码:
保存cookie
let cookieJar: NSHTTPCookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
let data: NSData = NSKeyedArchiver.archivedDataWithRootObject(cookieJar.cookies)
let ud: NSUserDefaults = NSUserDefaults.standardUserDefaults()
ud.setObject(data, forKey: "cookie")
检索 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)
}
}
}
这是 Objective-C 中的答案:
要保存 cookie:
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:cookieJar.cookies];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:data forKey:@"Cookies"];
要加载 cookie:
NSData *data = [defaults objectForKey:@"Cookies"];
if (data) {
NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:data];
if (cookies) {
for (NSHTTPCookie *cookie in cookies) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
}
}
SWIFT 4(并且没有强制展开)
func saveCookie() {
let cookieJar: HTTPCookieStorage = HTTPCookieStorage.shared
if let cookies = cookieJar.cookies {
let data: Data = NSKeyedArchiver.archivedData(withRootObject: cookies)
let ud: UserDefaults = UserDefaults.standard
ud.set(data, forKey: "cookie")
}
}
func loadCookie() {
let ud: UserDefaults = UserDefaults.standard
let data: Data? = ud.object(forKey: "cookie") as? Data
if let cookie = data {
let datas: NSArray? = NSKeyedUnarchiver.unarchiveObject(with: cookie) as? NSArray
if let cookies = datas {
for c in cookies {
if let cookieObject = c as? HTTPCookie {
HTTPCookieStorage.shared.setCookie(cookieObject)
}
}
}
}
}
例如,您可以在 didFinishNavigation
方法中调用 saveCookie()
(如果您使用的是 UIWebView
而不是 WKWebView
,则可以在 webViewDidFinishLoad
中调用)。
并且您可以在 viewDidLoad
中或在初始化 webView
之前调用 loadCookie()
。
我用 Swift 和一个打开 Web 应用程序的 UIWebView 开发了一个应用程序。 每次我们的用户打开该应用程序时,他们都需要重新登录,因为该应用程序不存储 cookie。我该如何解决?
我试过这个来存储 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
}
并再次检索 cookie:
NSHTTPCookieStorage.sharedHTTPCookieStorage().cookieAcceptPolicy = NSHTTPCookieAcceptPolicy.Always
let cookies = NSKeyedUnarchiver.unarchiveObjectWithData(NSUserDefaults.standardUserDefaults().objectForKey("cookies"))
我不知道如何在数组中检索 cookie 并迭代它们。
试试这个代码:
保存cookie
let cookieJar: NSHTTPCookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
let data: NSData = NSKeyedArchiver.archivedDataWithRootObject(cookieJar.cookies)
let ud: NSUserDefaults = NSUserDefaults.standardUserDefaults()
ud.setObject(data, forKey: "cookie")
检索 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)
}
}
}
这是 Objective-C 中的答案:
要保存 cookie:
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:cookieJar.cookies];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:data forKey:@"Cookies"];
要加载 cookie:
NSData *data = [defaults objectForKey:@"Cookies"];
if (data) {
NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:data];
if (cookies) {
for (NSHTTPCookie *cookie in cookies) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
}
}
SWIFT 4(并且没有强制展开)
func saveCookie() {
let cookieJar: HTTPCookieStorage = HTTPCookieStorage.shared
if let cookies = cookieJar.cookies {
let data: Data = NSKeyedArchiver.archivedData(withRootObject: cookies)
let ud: UserDefaults = UserDefaults.standard
ud.set(data, forKey: "cookie")
}
}
func loadCookie() {
let ud: UserDefaults = UserDefaults.standard
let data: Data? = ud.object(forKey: "cookie") as? Data
if let cookie = data {
let datas: NSArray? = NSKeyedUnarchiver.unarchiveObject(with: cookie) as? NSArray
if let cookies = datas {
for c in cookies {
if let cookieObject = c as? HTTPCookie {
HTTPCookieStorage.shared.setCookie(cookieObject)
}
}
}
}
}
例如,您可以在 didFinishNavigation
方法中调用 saveCookie()
(如果您使用的是 UIWebView
而不是 WKWebView
,则可以在 webViewDidFinishLoad
中调用)。
并且您可以在 viewDidLoad
中或在初始化 webView
之前调用 loadCookie()
。