Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iOS中的共享首选项中保存cookie?_Ios_Iphone_Swift_Http - Fatal编程技术网

如何在iOS中的共享首选项中保存cookie?

如何在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

如何在iOS中的共享首选项中保存cookie? 我以后怎么提取呢? 我想将HTTPCookieStorage.shared.cookies中的cookie保存到用户默认值中,然后在以后提取 请用Swift 3回答,请尝试以下代码:

商店:

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工作之后,我需要这个。