Нет описания

KeyChain.swift 2.2KB

    // // KeyChain.swift // PaiAi // // Created by FFIB on 16/5/3. // Copyright © 2016年 FFIB. All rights reserved. // import Foundation protocol DataConvertable { init?(data: Data) func toData() -> Data? } extension String: DataConvertable { init?(data: Data) { self.init(data: data, encoding: String.Encoding.utf8) } func toData() -> Data? { return self.data(using: String.Encoding.utf8) } } func GetInfoFromKeyChain<T: DataConvertable>(_ intoType: T.Type, key: String) -> T? { let keyChainDic = NSMutableDictionary() keyChainDic.setObject(String(kSecClassGenericPassword), forKey: kSecClass as! NSCopying) keyChainDic.setObject(key, forKey: kSecAttrAccount as! NSCopying) keyChainDic.setObject(kCFBooleanTrue, forKey: kSecReturnAttributes as! NSCopying) keyChainDic.setObject(kCFBooleanTrue, forKey: kSecReturnData as! NSCopying) var result: AnyObject? var resultObj: T? = nil SecItemCopyMatching(keyChainDic, &result) if let resultDic = result as? NSDictionary { if let data = resultDic.object(forKey: kSecValueData) as? Data { resultObj = T(data: data) } } return resultObj } enum KeyChainErrorCode: Int, Error { case alreadyExist = 10 case dataConvertFail case keyChainWriteFail } func SaveInfoToKeyChain<T: DataConvertable>(_ info: T, key: String, override: Bool = true) throws { let existObj = GetInfoFromKeyChain(type(of: info), key: key) guard existObj == nil || override else { throw KeyChainErrorCode.alreadyExist } let keyChainDic = NSMutableDictionary() keyChainDic.setObject(String(kSecClassGenericPassword), forKey: kSecClass as! NSCopying) keyChainDic.setObject(key, forKey: kSecAttrAccount as! NSCopying) guard let data = info.toData() else { throw KeyChainErrorCode.dataConvertFail } let updateDic: NSDictionary = [String(kSecValueData): data] var success: OSStatus = 0 if existObj == nil { keyChainDic.addEntries(from: updateDic as! [AnyHashable: Any]) success = SecItemAdd(keyChainDic, nil) } else { success = SecItemUpdate(keyChainDic, updateDic) } guard success == errSecSuccess else { throw KeyChainErrorCode.keyChainWriteFail } }