2017-05-15 40 views

回答

4

試試這個代碼:

商店:

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

謝謝。有效!!! – Gaurav

+0

燦爛的,可怕的! – Starwave

0

我的解決方案使用Swift 4,WKWebView & iOS 11.在服務器推送的PHPSESSID沒有跨應用程序運行保存的情況下工作,用戶已經登錄,因此sesssion應該繼續。用一些blurb來幫助調試:

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