【问题标题】:UIWebView: Save cookie state across app restartsUIWebView:在应用重新启动时保存 cookie 状态
【发布时间】:2015-07-31 23:47:15
【问题描述】:

我使用 Swift 和一个打开 webapp 的 UIWebView 开发了一个应用程序。 每次我们的用户打开应用程序时,他们都需要再次登录,因为应用程序没有存储 cookie。我该如何解决?

我试过这个来存储 cookie:

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 并对其进行迭代。

【问题讨论】:

    标签: ios swift cookies uiwebview


    【解决方案1】:

    试试这个代码:

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

    【讨论】:

    • 太棒了!我把这段代码放在哪里?我在何时何地调用该函数来检索 cookie?并保存它们?
    【解决方案2】:

    这是 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];
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-27
        • 1970-01-01
        • 2017-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多