与 REST API 通信并将 API token 保存在 iOS 的钥匙串(keychain)中。但钥匙串(keychain)代码抛出 nil
错误。
KeychainAccess.swift:
public class func passwordForAccount(account: String, service: String = "keyChainDefaultService") -> String? {
let queryAttributes = NSDictionary(objects: [secClassGenericPassword(), service, account, true], forKeys: [secClass(), secAttrService(), secAttrAccount(), secReturnData()])
var retrievedData: NSData?
var extractedData: AnyObject?
let status = SecItemCopyMatching(queryAttributes, &extractedData)
if (status == errSecSuccess) {
retrievedData = extractedData as? NSData
}
let password = NSString(data: retrievedData!, encoding: NSUTF8StringEncoding)
return (password as! String)
}
在上面的代码中,retrievedData
为零。如果我执行print(status)
,我会得到-25300
。从 View Controller 调用此函数:
// check if API token has expired
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let userTokenExpiryDate : String? = KeychainAccess.passwordForAccount("Auth_Token_Expiry", service: "KeyChainService")
let dateFromString : NSDate? = dateFormatter.dateFromString(userTokenExpiryDate!)
let now = NSDate()
我不知道我哪里出了问题。有什么指点吗?
最佳答案
var extractedData : AnyObject?;
let status = withUnsafeMutablePointer(&extractedData) {
SecItemCopyMatching(queryAttributes, UnsafeMutablePointer($0))
}
尝试这样做,这就是我必须让它工作的方式
关于ios - SecItemCopyMatching 返回 errSecItemNotFound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33092606/