如何在iOS中的共享首选项中保存cookie?
如何在iOS中的共享首选项中保存cookie? 我以后怎么提取呢? 我想将HTTPCookieStorage.shared.cookies中的cookie保存到用户默认值中,然后在以后提取 请用Swift 3回答,请尝试以下代码: 商店:如何在iOS中的共享首选项中保存cookie?,ios,iphone,swift,http,Ios,Iphone,Swift,Http,如何在iOS中的共享首选项中保存cookie? 我以后怎么提取呢? 我想将HTTPCookieStorage.shared.cookies中的cookie保存到用户默认值中,然后在以后提取 请用Swift 3回答,请尝试以下代码: 商店: func storeCookies() { let cookiesStorage = HTTPCookieStorage.shared let userDefaults = UserDefaults.standard let serv
func storeCookies() {
let cookiesStorage = HTTPCookieStorage.shared
let userDefaults = UserDefaults.standard
let serverBaseUrl = "http://example.com"
var cookieDict = [String : AnyObject]()
for cookie in cookiesStorage.cookies(for: NSURL(string: serverBaseUrl)! as URL)! {
cookieDict[cookie.name] = cookie.properties as AnyObject?
}
userDefaults.set(cookieDict, forKey: "cookiesKey")
}
func restoreCookies() {
let cookiesStorage = HTTPCookieStorage.shared
let userDefaults = UserDefaults.standard
if let cookieDictionary = userDefaults.dictionary(forKey: "cookiesKey") {
for (_, cookieProperties) in cookieDictionary {
if let cookie = HTTPCookie(properties: cookieProperties as! [HTTPCookiePropertyKey : Any] ) {
cookiesStorage.setCookie(cookie)
}
}
}
}
检索:
func storeCookies() {
let cookiesStorage = HTTPCookieStorage.shared
let userDefaults = UserDefaults.standard
let serverBaseUrl = "http://example.com"
var cookieDict = [String : AnyObject]()
for cookie in cookiesStorage.cookies(for: NSURL(string: serverBaseUrl)! as URL)! {
cookieDict[cookie.name] = cookie.properties as AnyObject?
}
userDefaults.set(cookieDict, forKey: "cookiesKey")
}
func restoreCookies() {
let cookiesStorage = HTTPCookieStorage.shared
let userDefaults = UserDefaults.standard
if let cookieDictionary = userDefaults.dictionary(forKey: "cookiesKey") {
for (_, cookieProperties) in cookieDictionary {
if let cookie = HTTPCookie(properties: cookieProperties as! [HTTPCookiePropertyKey : Any] ) {
cookiesStorage.setCookie(cookie)
}
}
}
}
我使用Swift 4、WKWebView和iOS 11的解决方案。在一个案例中,从服务器推送的PHPSESSID没有在应用程序运行期间保存,用户已经登录,因此session应该继续。通过一些帮助调试的简介:
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
@IBOutlet weak var html: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
html.navigationDelegate = self
retrieve_cookies()
}
func opensite()
{
let addr = "https://thesite.com/bla/bla"
let url = URL(string: addr)!
let request = URLRequest(url: url)
html.load(request)
}
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
let ds = WKWebsiteDataStore.default()
let cookies = ds.httpCookieStore
cookies.getAllCookies { (cookies: [HTTPCookie]) in
for cookie in cookies {
NSLog("Known cookie at load: \(cookie.name)")
}
}
NSLog("Starting to load")
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
NSLog("** Error" + error.localizedDescription)
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
NSLog("Load finished")
let ds = WKWebsiteDataStore.default()
let cookies = ds.httpCookieStore
cookies.getAllCookies { (cookies: [HTTPCookie]) in
var cookieDict = [String : AnyObject]()
for cookie in cookies {
NSLog("Saved cookie: \(cookie.name)")
cookieDict[cookie.name] = cookie.properties as AnyObject?
}
UserDefaults.standard.set(cookieDict, forKey: "cookiez")
}
}
func retrieve_cookies()
{
let ds = WKWebsiteDataStore.default()
let cookies = ds.httpCookieStore
let userDefaults = UserDefaults.standard
if let cookieDict = userDefaults.dictionary(forKey: "cookiez") {
NSLog("Retrieving cookies")
var cookies_left = 0
for (_, cookieProperties) in cookieDict {
if let _ = HTTPCookie(properties: cookieProperties as! [HTTPCookiePropertyKey : Any] ) {
cookies_left += 1
}
}
for (_, cookieProperties) in cookieDict {
if let cookie = HTTPCookie(properties: cookieProperties as! [HTTPCookiePropertyKey : Any] ) {
cookies.setCookie(cookie, completionHandler: {
cookies_left -= 1
NSLog("Retrieved cookie, \(cookies_left) to go")
if cookies_left == 0 {
self.opensite()
}
})
}
}
} else {
NSLog("No saved cookies")
opensite()
}
}
太好了,沃克斯!这对我帮助很大。我正在手动保存来自wkwebview的服务器响应得到的所有新cookie。然后在启动我的wkwebview时手动加载它们。在我被要求使用WKWebsiteDataStore.nonPersistent()使SSO工作之后,我需要这个。