栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从KeyChain保存和加载| 斯威夫特

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从KeyChain保存和加载| 斯威夫特

最简单的来源

import Foundationimport Security// Constant Identifierslet userAccount = "AuthenticatedUser"let accessGroup = "SecuritySerivice"let passwordKey = "KeyForPassword"// Arguments for the keychain querieslet kSecClassValue = NSString(format: kSecClass)let kSecAttrAccountValue = NSString(format: kSecAttrAccount)let kSecValueDataValue = NSString(format: kSecValueData)let kSecClassGenericPasswordValue = NSString(format: kSecClassGenericPassword)let kSecAttrServicevalue = NSString(format: kSecAttrService)let kSecMatchLimitValue = NSString(format: kSecMatchLimit)let kSecReturnDataValue = NSString(format: kSecReturnData)let kSecMatchLimitonevalue = NSString(format: kSecMatchLimitOne)public class KeychainService: NSObject {        public class func savePassword(token: NSString) {        self.save(passwordKey, data: token)    }    public class func loadPassword() -> NSString? {        return self.load(passwordKey)    }        private class func save(service: NSString, data: NSString) {        let dataFromString: NSData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!        // Instantiate a new default keychain query        let keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, dataFromString], forKeys: [kSecClassValue, kSecAttrServicevalue, kSecAttrAccountValue, kSecValueDataValue])        // Delete any existing items        SecItemDelete(keychainQuery as CFDictionaryRef)        // Add the new keychain item        SecItemAdd(keychainQuery as CFDictionaryRef, nil)    }    private class func load(service: NSString) -> NSString? {        // Instantiate a new default keychain query        // Tell the query to return a result        // Limit our results to one item        let keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, kCFBooleanTrue, kSecMatchLimitOnevalue], forKeys: [kSecClassValue, kSecAttrServicevalue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue])        var dataTypeRef :AnyObject?        // Search for the keychain items        let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef)        var contentsOfKeychain: NSString? = nil        if status == errSecSuccess { if let retrievedData = dataTypeRef as? NSData {     contentsOfKeychain = NSString(data: retrievedData, encoding: NSUTF8StringEncoding) }        } else { print("Nothing was retrieved from the keychain. Status pre (status)")        }        return contentsOfKeychain    }}

通话范例

KeychainService.savePassword("Pa55worD")let password = KeychainService.loadPassword() // password = "Pa55worD"

SWIFT 4:具有更新和删除密码的版本

import Cocoaimport Security// see https://stackoverflow.com/a/37539998/1694526// Arguments for the keychain querieslet kSecClassValue = NSString(format: kSecClass)let kSecAttrAccountValue = NSString(format: kSecAttrAccount)let kSecValueDataValue = NSString(format: kSecValueData)let kSecClassGenericPasswordValue = NSString(format: kSecClassGenericPassword)let kSecAttrServicevalue = NSString(format: kSecAttrService)let kSecMatchLimitValue = NSString(format: kSecMatchLimit)let kSecReturnDataValue = NSString(format: kSecReturnData)let kSecMatchLimitonevalue = NSString(format: kSecMatchLimitOne)public class KeychainService: NSObject {    class func updatePassword(service: String, account:String, data: String) {        if let dataFromString: Data = data.data(using: String.Encoding.utf8, allowLossyConversion: false) { // Instantiate a new default keychain query let keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, account], forKeys: [kSecClassValue, kSecAttrServicevalue, kSecAttrAccountValue]) let status = SecItemUpdate(keychainQuery as CFDictionary, [kSecValueDataValue:dataFromString] as CFDictionary) if (status != errSecSuccess) {     if let err = SecCopyErrorMessageString(status, nil) {         print("Read failed: (err)")     } }        }    }    class func removePassword(service: String, account:String) {        // Instantiate a new default keychain query        let keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, account, kCFBooleanTrue], forKeys: [kSecClassValue, kSecAttrServicevalue, kSecAttrAccountValue, kSecReturnDataValue])        // Delete any existing items        let status = SecItemDelete(keychainQuery as CFDictionary)        if (status != errSecSuccess) { if let err = SecCopyErrorMessageString(status, nil) {     print("Remove failed: (err)") }        }    }    class func savePassword(service: String, account:String, data: String) {        if let dataFromString = data.data(using: String.Encoding.utf8, allowLossyConversion: false) { // Instantiate a new default keychain query let keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, account, dataFromString], forKeys: [kSecClassValue, kSecAttrServicevalue, kSecAttrAccountValue, kSecValueDataValue]) // Add the new keychain item let status = SecItemAdd(keychainQuery as CFDictionary, nil) if (status != errSecSuccess) {    // Always check the status     if let err = SecCopyErrorMessageString(status, nil) {         print("Write failed: (err)")     } }        }    }    class func loadPassword(service: String, account:String) -> String? {        // Instantiate a new default keychain query        // Tell the query to return a result        // Limit our results to one item        let keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, account, kCFBooleanTrue, kSecMatchLimitOnevalue], forKeys: [kSecClassValue, kSecAttrServicevalue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue])        var dataTypeRef :AnyObject?        // Search for the keychain items        let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef)        var contentsOfKeychain: String?        if status == errSecSuccess { if let retrievedData = dataTypeRef as? Data {     contentsOfKeychain = String(data: retrievedData, encoding: String.Encoding.utf8) }        } else { print("Nothing was retrieved from the keychain. Status pre (status)")        }        return contentsOfKeychain    }}

您需要想象以下内容连接到文本输入字段和标签,然后连接四个按钮,每种方法一个。

class ViewController: NSViewController {    @IBOutlet weak var enterPassword: NSTextField!    @IBOutlet weak var retrievedPassword: NSTextField!    let service = "myService"    let account = "myAccount"    // will only work after    @IBAction func updatePassword(_ sender: Any) {        KeychainService.updatePassword(service: service, account: account, data: enterPassword.stringValue)    }    @IBAction func removePassword(_ sender: Any) {        KeychainService.removePassword(service: service, account: account)    }    @IBAction func passwordSet(_ sender: Any) {        let password = enterPassword.stringValue        KeychainService.savePassword(service: service, account: account, data: password)    }    @IBAction func passwordGet(_ sender: Any) {        if let str = KeychainService.loadPassword(service: service, account: account) { retrievedPassword.stringValue = str        }        else {retrievedPassword.stringValue = "Password does not exist" }    }}

斯威夫特5

迅捷的Kosuke 版本 5

import Securityclass KeyChain {    class func save(key: String, data: Data) -> OSStatus {        let query = [ kSecClass as String       : kSecClassGenericPassword as String, kSecAttrAccount as String : key, kSecValueData as String   : data ] as [String : Any]        SecItemDelete(query as CFDictionary)        return SecItemAdd(query as CFDictionary, nil)    }    class func load(key: String) -> Data? {        let query = [ kSecClass as String       : kSecClassGenericPassword, kSecAttrAccount as String : key, kSecReturnData as String  : kCFBooleanTrue!, kSecMatchLimit as String  : kSecMatchLimitOne ] as [String : Any]        var dataTypeRef: AnyObject? = nil        let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)        if status == noErr { return dataTypeRef as! Data?        } else { return nil        }    }    class func createUniqueID() -> String {        let uuid: CFUUID = CFUUIDCreate(nil)        let cfStr: CFString = CFUUIDCreateString(nil, uuid)        let swiftString: String = cfStr as String        return swiftString    }}extension Data {    init<T>(from value: T) {        var value = value        self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))    }    func to<T>(type: T.Type) -> T {        return self.withUnsafeBytes { $0.load(as: T.self) }    }}

用法示例:

let int: Int = 555let data = Data(from: int)let status = KeyChain.save(key: "MyNumber", data: data)print("status: ", status)if let receivedData = KeyChain.load(key: "MyNumber") {    let result = receivedData.to(type: Int.self)    print("result: ", result)}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/448305.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号