// // KeychainManager.swift // birmm_inspect_ios_app // // Created by 203 on 2021/7/9. // import Foundation class KeychainManager: NSObject { // TODO: 创建查询条件 class func createQueryMutableDictionary(identifier: String) -> NSMutableDictionary { // 创建一个条件字典 let keychainQueryMutableDictionary = NSMutableDictionary(capacity: 0) // 设置条件存储的类型 keychainQueryMutableDictionary.setValue(kSecClassGenericPassword, forKey: kSecClass as String) // 设置存储数据的标记 keychainQueryMutableDictionary.setValue(identifier, forKey: kSecAttrService as String) keychainQueryMutableDictionary.setValue(identifier, forKey: kSecAttrAccount as String) // 设置数据访问属性 keychainQueryMutableDictionary.setValue(kSecAttrAccessibleAfterFirstUnlock, forKey: kSecAttrAccessible as String) // 返回创建条件字典 return keychainQueryMutableDictionary } // TODO: 存储数据 class func keyChainSaveData(data: Any, withIdentifier identifier: String) -> Bool { // 获取存储数据的条件 let keyChainSaveMutableDictionary = createQueryMutableDictionary(identifier: identifier) // 删除旧的存储数据 SecItemDelete(keyChainSaveMutableDictionary) // 设置数据 keyChainSaveMutableDictionary.setValue(NSKeyedArchiver.archivedData(withRootObject: data), forKey: kSecValueData as String) // 进行存储数据 let saveState = SecItemAdd(keyChainSaveMutableDictionary, nil) if saveState == noErr { return true } return false } // TODO: 更新数据 class func keyChainUpdate(data: Any, withIdentifier identifier: String) -> Bool { // 获取更新的条件 let keyChainUpdateMutableDictionary = createQueryMutableDictionary(identifier: identifier) // 创建数据存储字典 let updateMutableDictionary = NSMutableDictionary(capacity: 0) // 设置数据 updateMutableDictionary.setValue(NSKeyedArchiver.archivedData(withRootObject: data), forKey: kSecValueData as String) // 更新数据 let updateStatus = SecItemUpdate(keyChainUpdateMutableDictionary, updateMutableDictionary) if updateStatus == noErr { return true } return false } // TODO: 获取数据 class func keyChainReadData(identifier: String) -> Any { var idObject: Any? // 获取查询条件 let keyChainReadmutableDictionary = createQueryMutableDictionary(identifier: identifier) // 提供查询数据的两个必要参数 keyChainReadmutableDictionary.setValue(kCFBooleanTrue, forKey: kSecReturnData as String) keyChainReadmutableDictionary.setValue(kSecMatchLimitOne, forKey: kSecMatchLimit as String) // 创建获取数据的引用 var queryResult: AnyObject? // 通过查询是否存储在数据 let readStatus = withUnsafeMutablePointer(to: &queryResult) { SecItemCopyMatching(keyChainReadmutableDictionary, UnsafeMutablePointer($0)) } if readStatus == errSecSuccess { if let data = queryResult as! NSData? { idObject = NSKeyedUnarchiver.unarchiveObject(with: data as Data) as Any } } return idObject as Any } // TODO: 删除数据 class func keyChainDelete(identifier: String) { // 获取删除的条件 let keyChainDeleteMutableDictionary = createQueryMutableDictionary(identifier: identifier) // 删除数据 SecItemDelete(keyChainDeleteMutableDictionary) } }