Swift语言操作KeyChain

艾令秋
2023-12-01


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

 类似资料: