Adding item to keychain using Swift

前端 未结 7 1941
栀梦
栀梦 2020-12-28 08:45

I\'m trying to add an item to the iOS keychain using Swift but can\'t figure out how to type cast properly. From WWDC 2013 session 709, given the following Objective-C code:

相关标签:
7条回答
  • 2020-12-28 09:37

    Perhaps things have improved since. On Xcode 7 beta 4, no casting seems to be necessary except when dealing with the result AnyObject?. Specifically, the following seems to work:

    var query : [NSString : AnyObject] = [
        kSecClass : kSecClassGenericPassword,
        kSecAttrService : "MyAwesomeService",
        kSecReturnAttributes : true,   // return dictionary in result parameter
        kSecReturnData : true          // include the password value
    ]
    var result : AnyObject?
    let err = SecItemCopyMatching(query, &result)
    if (err == errSecSuccess) {
        // on success cast the result to a dictionary and extract the
        // username and password from the dictionary.
        if let result = result as ? [NSString : AnyObject],
           let username = result[kSecAttrAccount] as? String,
           let passdata = result[kSecValueData] as? NSData,
           let password = NSString(data:passdata, encoding:NSUTF8StringEncoding) as? String {
            return (username, password)
        }
    } else if (status == errSecItemNotFound) {
        return nil;
    } else {
        // probably a program error,
        // print and lookup err code (e.g., -50 = bad parameter)
    }
    

    To add a key if it was missing:

    var query : [NSString : AnyObject] = [
        kSecClass : kSecClassGenericPassword,
        kSecAttrService : "MyAwesomeService",
        kSecAttrLabel : "MyAwesomeService Password",
        kSecAttrAccount : username,
        kSecValueData : password.dataUsingEncoding(NSUTF8StringEncoding)!
    ]
    let result = SecItemAdd(query, nil)
    // check that result is errSecSuccess, etc...
    

    A few things to point out: your initial problem might have been that str.dataUsingEncoding returns an Optional. Adding '!' or better yet, using an if let to handle nil return, would likely make your code work. Printing out the error code and looking it up in the docs will help a lot in isolating the problem (I was getting err -50 = bad parameter, until I noticed a problem with my kSecClass, nothing to do with data types or casts!).

    0 讨论(0)
提交回复
热议问题