func keyChainIdentifier(identifier:String) -> [CFString : Any] {
return [kSecClass:kSecClassGenericPassword,
kSecAttrService:identifier,
kSecAttrAccount:identifier,
kSecAttrAccessible:kSecAttrAccessibleAfterFirstUnlock]
}
- 保存数据
/**
保存数据
- parameter data: 要存储的数据
- parameter identifier: 存储数据的标示
- returns 成功/失败
*/
func keyChainSaveData(data:Any, identifier:String) -> Bool {
//存储数据的条件
var saveQueryInfo = keyChainIdentifier(identifier: identifier)
//删除旧的数据
SecItemDelete((saveQueryInfo as CFDictionary))
//设置新的数据
saveQueryInfo[kSecValueData] = NSKeyedArchiver.archivedData(withRootObject: data)
//添加数据
let saveState = SecItemAdd((saveQueryInfo as CFDictionary), nil)
// 判断是否存储成功
if saveState == errSecSuccess {
return true
}
return false
}
- 读取数据
/**
读取数据
- parameter identifier: 存储数据的标示
*/
func keyChainReadData(identifier:String) -> String? {
//通过标记获取数据查询条件
var readQueryInfo:[CFString : Any] = keyChainIdentifier(identifier: identifier)
// 设置搜索条件:这是获取数据的时,必须提供的两个属性
// 查询结果返回到 kSecValueData
readQueryInfo[kSecReturnData] = kCFBooleanTrue
// 只返回搜索到的第一条数据
readQueryInfo[kSecMatchLimit] = kSecMatchLimitOne
// 创建一个数据对象
var extractedData: AnyObject?
// 通过条件查询数据
SecItemCopyMatching(readQueryInfo as CFDictionary, &extractedData)
if extractedData == nil {
return nil
}
let unarchiverData = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(extractedData as! Data)
if unarchiverData is String {
return (unarchiverData as!String)
}
return nil
}
- 修改数据
/**
更新数据
- parameter data: 要更新的数据
- parameter identifier: 数据存储时的标示
- returns 成功/失败
*/
func keyChainUpdata(data:Any, identifier:String) -> Bool {
// 通过标记获取数据更新的条件
let updataQueryInfo = keyChainIdentifier(identifier: identifier)
// 创建更新数据字典
let updataInfo:[CFString : Any] = [kSecValueData:NSKeyedArchiver.archivedData(withRootObject: data)]
// 获取存储的状态
let updataStatus = SecItemUpdate(updataQueryInfo as CFDictionary, updataInfo as CFDictionary)
// 判断是否存储成功
if updataStatus == errSecSuccess {
return true
}
return false
}
- 删除数据
/**
删除数据
- parameter identifier: 存储数据的标示
*/
func keyChainDelete(identifier:String) {
//获取删除数据的查询条件
let deleteQueryInfo:[CFString : Any] = keyChainIdentifier(identifier: identifier)
SecItemDelete(deleteQueryInfo as CFDictionary)
}
网友评论