ios - SecItemCopyMatching 返回 errSecItemNotFound

标签 ios swift keychain

与 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/

相关文章:

ios - 无法解锁钥匙串(keychain)

ios - 如何阻止 subview 的 didSelectRowAtIndexPath?

ios - 如何根据 Segue 身份从 Collection View 单元格转到特定的 View Controller

ios - 铿锵错误 : function definition declared 'typedef'

ios - 应用程序图标未分配图像编译警告消息

ios - 在表格 View 单元格中制作 'Read More' 按钮

swift - 初学者 swift Sprite 工具包 - 节点碰撞检测帮助(SKPhysicsContact)

ios - Apple Watch 的已知 WiFi 网络?

ios - 从 UIBarButtonItem 显示 UIMenuController

macos - Mac 钥匙串(keychain) - 记住 svn+ssh//密码