小编Pas*_*tne的帖子

使用Swift将项添加到钥匙串

我正在尝试使用Swift将项目添加到iOS钥匙串,但无法弄清楚如何正确输入强制转换.从WWDC 2013会议709开始,给出以下Objective-C代码:

NSData *secret = [@"top secret" dataWithEncoding:NSUTF8StringEncoding];
NSDictionary *query = @{
    (id)kSecClass: (id)kSecClassGenericPassword,
    (id)kSecAttrService: @"myservice",
    (id)kSecAttrAccount: @"account name here",
    (id)kSecValueData: secret,
};

OSStatus = SecItemAdd((CFDictionaryRef)query, NULL);
Run Code Online (Sandbox Code Playgroud)

尝试在Swift中执行如下操作:

var secret: NSData = "Top Secret".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
var query: NSDictionary = [
    kSecClass: kSecClassGenericPassword,
    kSecAttrService: "MyService",
    kSecAttrAccount: "Some account",
    kSecValueData: secret
]
Run Code Online (Sandbox Code Playgroud)

产生错误"无法将表达式的类型'Dictionary'转换为'DictionaryLiteralConvertible'.

我采用的另一种方法是使用Swift和- setObject:forKey:Dictionary上的方法来添加kSecClassGenericPassword和密钥kSecClass.

在Objective-C中:

NSMutableDictionary *searchDictionary = [NSMutableDictionary dictionary];
[searchDictionary setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
Run Code Online (Sandbox Code Playgroud)

在Objective-C代码中,使用id桥接各种keychain项类键的CFTypeRef.在Swift 文档中,提到Swift将id作为AnyObject导入.但是,当我试图将kSecClass转发为方法的AnyObject时,我得到的错误是"Type'AnyObject'不符合NSCopying.

任何帮助,无论是直接答案还是有关如何与Core Foundation类型交互的指导,都将受到赞赏.

编辑2

此解决方案从Xcode 6 Beta 2开始不再有效.如果您使用Beta 1,则以下代码可能有效.

var secret: NSData = …
Run Code Online (Sandbox Code Playgroud)

keychain ios swift

13
推荐指数
3
解决办法
1万
查看次数

使用非托管<AnyObject>!作为NSMutableDictionary的关键

我正在尝试创建一个keychain查询,但我在使用Attribute Item Keys作为字典键时遇到了困难.在创建字典时,我可以将包含在数组中的属性项作为字典键传递,如此没有任何问题

genericPasswordQuery = NSMutableDictionary(objects: [kSecClassGenericPassword, identifier], forKeys: [kSecClass, kSecAttrGeneric])
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试将另一个类似项添加到查询字典中,如下所示:

genericPasswordQuery.setObject(accessGroup, key:kSecAttrAccessGroup)
Run Code Online (Sandbox Code Playgroud)

它抱怨密钥不符合NSCopying并提供类型错误:

"无法找到接受所提供参数的'setObject'的重载"

这是SecItemAdd的标准实现,但我在Swift中遇到问题.

keychain swift

4
推荐指数
1
解决办法
3579
查看次数

标签 统计

keychain ×2

swift ×2

ios ×1