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/

相关文章:

swift - 快速访问嵌套键值对

ios - Cordova Keychain 插件是否适用于 iOS 6.1

iphone - 私有(private) iOS API 以访问来自 iPhone 上降噪麦克风的原始输入?

objective-c - UILayer自定义 'compact'动画,求主播帮助

ios - 嵌入 Youtube 视频 :- with contains content from * , 它被限制在某些网站上播放

swift - 如何为字符串中的每个字母设置 UIColor

SwiftUI:如何横向呈现 FullScreenCover

android - 如何让两个或多个React Native应用程序彼此共享数据?

iOS:如何检查钥匙串(keychain)中是否保存了数据?

ios - 订阅对@Published 的更改