Swift语言操作KeyChain

本文详细介绍了如何在Swift中使用KeyChain进行信息保存、获取、更新和删除操作,包括KeyChain的相关设置和可能出现的问题处理,特别关注了更新KeyChain信息时的-50错误处理。通过实例代码展示,确保在Xcode 7.3.1和iPhone 6 Plus 9.3.2上运行成功。


关于利用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上验证成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值