【问题标题】:How can I save credentials/session in a iOS web app?如何在 iOS Web 应用程序中保存凭据/会话?
【发布时间】:2020-04-30 16:21:03
【问题描述】:

我正在制作一个 iOS 网络应用程序,我想保存凭据以保持会话打开。这是我第一次开发 iOS 应用

目前我只这样做:

class ViewController: UIViewController {

    @IBOutlet weak var KronosWebsite: WKWebView!
    let myUrl = URL(string:"https://mobi.kronos-sport.com")
    override func viewDidLoad() {
        super.viewDidLoad()
        let myRequest = URLRequest(url : myUrl!)
        KronosWebsite.load(myRequest)
    }
}

【问题讨论】:

    标签: ios swift session web-applications credentials


    【解决方案1】:

    虽然从您的问题的外观来看,我认为这不是您寻找的存储凭据的正确方法是拥有一个 API 路由,您可以获得访问令牌和刷新令牌,您将使用与 API 交互,即使您只是想将其用作登录名。最好是 OAuth(因为它是最安全的),但坦率地说,您可以使用任何您认为适合您的解决方案的方式。

    注意:访问和刷新令牌应保存在 iOS 钥匙串中,因为它是存储凭据的最安全方式。

    钥匙串是存储小秘密(如密码)的最佳场所 和加密密钥。 https://developer.apple.com/documentation/security/certificate_key_and_trust_services/keys/storing_keys_in_the_keychain

    注意:或者,如果必须,您可以像这样存储该 WKWebView 的 cookie(但这不是标准):

        if #available(iOS 11, *) {
            let dataStore = WKWebsiteDataStore.default()
            dataStore.httpCookieStore.getAllCookies({ (cookies) in
                print(cookies)
            })
        } else {
            guard let cookies = HTTPCookieStorage.shared.cookies else {
                return
            }
            print(cookies)
        }
    

    有关存储 Cookie 的更多信息: https://medium.com/better-programming/how-to-get-cookies-from-wkwebview-and-uiwebview-in-swift-46e1a072a606

    【讨论】:

    • 感谢您的回复 Juan Carlos,在最后一个链接中,他们将 cookie 存储在“viewWillDisappear”中,但似乎不能调用此函数(其中的打印在控制台中不可见)
    • 是的,但这只是一个例子。您需要在需要时放置代码。 ViewWillDisappear 在视图被取消初始化时被调用
    • 但我的回答的重点是你试图在你的应用程序中应用一个错误的逻辑,这不是你应该处理它的方式,如果你这样尝试,苹果会拒绝你的应用程序跨度>
    • 也不要发布问题作为答案!这不是 stackoverflow 的工作方式!
    【解决方案2】:

    @胡安卡洛斯 我尝试做类似的事情,但我不知道如何存储字典

    func storeCookies(){
        if #available(iOS 11, *) {
            let dataStore = WKWebsiteDataStore.default()
            dataStore.httpCookieStore.getAllCookies { cookies in
               var c: [String:String]=[:]
               for cookie in cookies {
                    c[cookie.name]=cookie.value
               }
            print(c)
            SecItemAdd(c as CFDictionary,nil)
            }
        } else {
            guard let cookies = HTTPCookieStorage.shared.cookies else {
                return
            }
            var c: [String:String]=[:]
            for cookie in cookies {
              var c: [String:String] = [cookie.name:cookie.value]
                 c[cookie.name]=cookie.value
             }
            SecItemAdd(c as CFDictionary,nil)
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2013-05-05
      • 1970-01-01
      相关资源
      最近更新 更多