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:保存登录信息的主要内容,如果未能解决你的问题,请参考以下文章