Swift 3:保存登录信息

Posted

技术标签:

【中文标题】Swift 3:保存登录信息【英文标题】:Swift 3: Saving login information 【发布时间】:2018-08-08 18:08:59 【问题描述】:

我正在 Xcode 8.2.1 中开发一个简单的 webview 应用程序。

是的,我知道。有更新的版本可用,但我分配的 Mac 不会更新到 High Sierra。我被 El Capitan 困住了。因此,我遵循了一些简单的教程,并开始开发一个简单的应用程序来加载我的网站。 应用程序本身可以运行,但有一个小问题:当用户关闭应用程序时,cookie 会自行销毁,用户将不得不再次登录。 如果他们不小心关闭了应用程序或类似的东西,我不想让他们再次登录。 我怎样才能做到这一点?我阅读了我可以使用的here

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate 
    
    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    HTTPCookieStorage.shared.cookieAcceptPolicy = HTTPCookie.AcceptPolicy.always
        return true
    

但是,很遗憾,它不起作用,并且在关闭应用程序后登录信息将被清除。

这是ViewController.swift

import UIKit

class ViewController: UIViewController, UIWebViewDelegate 


    @IBOutlet weak var myWebView: UIWebView!
    @IBAction func backButton(_ sender: Any)
    
        if myWebView.canGoBack
            myWebView.goBack()
        
    
    @IBAction func refreshButton(_ sender: Any)
    
        myWebView.reload()
    

    @IBAction func forwardButton(_ sender: Any)
    
        if myWebView.canGoForward
            myWebView.goForward()
        
    

    func webViewDidStartLoad(_ webView: UIWebView) 
        UIApplication.shared.isNetworkActivityIndicatorVisible = true
    

    func webViewDidFinishLoad(_ webView: UIWebView) 
        UIApplication.shared.isNetworkActivityIndicatorVisible = false
    

    override func viewDidLoad() 
        super.viewDidLoad()
        myWebView.loadRequest(URLRequest(url: URL(string: "myURL")!))

    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    



这是AppDelegate.swift

import UIKit

@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate 
    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
        HTTPCookieStorage.shared.cookieAcceptPolicy = HTTPCookie.AcceptPolicy.always
        return true
    

    func applicationWillResignActive(_ application: UIApplication) 

    

    func applicationDidEnterBackground(_ application: UIApplication) 

    

    func applicationWillEnterForeground(_ application: UIApplication) 

    

    func applicationDidBecomeActive(_ application: UIApplication) 

    

    func applicationWillTerminate(_ application: UIApplication) 

    

    func saveCookies() 
        guard let cookies = HTTPCookieStorage.shared.cookies else 
            return
        
        let array = cookies.flatMap  (cookie) -> [HTTPCookiePropertyKey: Any]? in
            cookie.properties
        
        UserDefaults.standard.set(array, forKey: "cookies")
        UserDefaults.standard.synchronize()
    

    func loadCookies() 
        guard let cookies = UserDefaults.standard.value(forKey: "cookies") as? [[HTTPCookiePropertyKey: Any]] else 
            return
        
        cookies.forEach  (cookie) in
            guard let cookie = HTTPCookie.init(properties: cookie) else 
                return
            
            HTTPCookieStorage.shared.setCookie(cookie)
        
    


此应用不会在应用商店上发布,它仅供我公司的三个用户使用。这就是为什么我决定做一件简单的事情而不是大规模的事情。

【问题讨论】:

如果您不介意我的提问,如果它只是一个简单的 webview 应用程序,为什么不让他们直接浏览相关网站呢?那么他们的浏览器可以为他们保存详细信息吗? 我老板的订单。他希望它以这种方式工作。 * 叹息 * 这就是我最初的建议。 在这种情况下,您是否 100% 确定网站本身也会保留 cookie?还是在浏览器关闭时也会过期?问题可能在于那里的 cookie 时间而不是 ios 应用程序 100% 确定。我为 android 做了同样的事情,我没有遇到任何问题。 注意:如果你只是简单地按下主页按钮并再次打开应用程序,那就很酷了。当您使用任务管理器关闭应用程序以及从最近的应用程序中删除它时,就会出现问题。我在 Android 应用程序中没有这个问题。我可以关闭手机并保持活动会话。 【参考方案1】:

我只需要重新设置 cookie。

NSData *cookiesdata = [[NSUserDefaults standardUserDefaults] objectForKey:@"MySavedCookies"];
if([cookiesdata length]) 
    NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:cookiesdata];
    NSHTTPCookie *cookie;

    for (cookie in cookies) 
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
    

【讨论】:

以上是关于Swift 3:保存登录信息的主要内容,如果未能解决你的问题,请参考以下文章

纵向/横向显示ios swift 3

爬虫3

JSP中怎样用session保存并验证用户登录信息

Swift Cloudkit 获取当前用户信息以在整个应用程序中使用

Swift 3 添加带有电话和电子邮件信息的新联系人

登录保存用户信息