关于利用KeyChain保存信息到iphone上,网上有一些信息,但往往有各种问题。尤其是更新KeyChain信息时,常常遇到错误代码-50。苹果在对开发者的支持力度上与微软的差距不是一般的大。还好有stackoverflow.com这个平台,可以看到一些其他人碰到的类似问题和处理方式,虽然没有找到满意的答复,但参考多方的代码总算把程序调通了。现分享如下:
1、引用Security:
import Security
2、添加KeyChain:
var addQuery : [NSString : AnyObject] = [
kSecClass : kSecClassGenericPassword,
kSecAttrService : "MyService",
kSecAttrLabel : "My UUID",
kSecAttrAccount : "MyUsername",
kSecValueData : "12345678".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
]
let result = SecItemAdd(addQuery, nil)
if result == errSecSuccess {
//操作成功处理
}
else {
//操作失败处理
}
3、获取KeyChain内容
var requestQuery : [NSString : AnyObject] = [
kSecClass : kSecClassGenericPassword,
kSecAttrService : "MyService",
kSecReturnAttrbutes : true,
kSecReturnData : true
]
var requestResult : AnyObject?
let err = SecItemCopyMatching(requestQuery, &requestResult)
if err == errSecSuccess {
if let results = requestResult as? [NSString : AnyObject],
let username = results[lSecAttrAccount] as? String,
let passdata = results[kSecValueData] as? NSData,
let password = NSString(data:passdata, encoding:NSUTF8StringEncoding) as? String {
//获取成功后的处理
}
}
else if err == errSecItemNotFound {
//未获取到信息的处理
}
else {
//其他错误的处理
}
4、更新KeyChain
var updateQuery : [NSString : AnyObject] = [
kSecClass : kSecClassGenericPassword,
kSecAttrService : "MyService",//非必需,建议加上
kSecAttrLabel : "My UUID",//非必需,建议加上
kSecAttrAccount : "MyUsername"//非必需,建议加上
]
var updateValue : [NSString : AnyObject] = [
kSecValueData : "87654321".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
]
let err = SecItemUpdate(updateQuery, updateValue)
if err == errSecSuccess {
//成功处理
}
else {
//失败处理
}
5、删除KeyChain
var query : [NSString : AnyObject] = [
kSecClass : kSecClassGenericPassword,
kSecAttrService : "MyService"
]
let status = SecItemDelete(query)
if status == errSecSuccess {
//删除成功处理
}
else {
//删除失败处理
}
以上代码在Xcode7.3.1及iphone 6 plus 9.3.2上验证成功。