SecItemCopyMatching 的 swift 2.0 钥匙串类型错误

Posted

技术标签:

【中文标题】SecItemCopyMatching 的 swift 2.0 钥匙串类型错误【英文标题】:swift 2.0 keychain type errors for SecItemCopyMatching 【发布时间】:2015-09-03 14:10:30 【问题描述】:

我们在以前版本的 Swift 中使用了这个 sn-p 代码

    var retrievedData: NSData?
    var extractedData: Unmanaged<AnyObject>? = nil
    let status = SecItemCopyMatching(keyChainQuery, &extractedData)

    if (status == errSecSuccess) 
        if let validExtractedData = extractedData 
            let opaque = validExtractedData.toOpaque()
            retrievedData = Unmanaged<NSData>.fromOpaque(opaque).takeUnretainedValue()
        
    

但是现在这给了我们以下错误:

无法转换“inout Unmanaged”类型的值? (又名 'inout Optional>') 到预期的参数类型 'UnsafeMutablePointer'(又名 'UnsafeMutablePointer>')

我对如何修复它有点迷茫。 我想我必须分配一些内存,为其创建一个 UnsafeMutablePointer,然后将其提供给 SecItemCopyMatching?

我试过这个:

    let sizeOfKey = 32
    var store = NSMutableData(capacity: sizeOfKey)!
    let status = SecItemCopyMatching(keyChainQuery, store.bytes)

但这给了我一个:

无法转换“UnsafePointer”类型的值(又名 'UnsafePointer') 到预期的参数类型 'UnsafeMutablePointer'(又名 'UnsafeMutablePointer>') 错误

谁有想法?

【问题讨论】:

【参考方案1】:

看来,我们不再需要Unmanaged&lt;&gt; 工作了。

试试:

var retrievedData: NSData?
var extractedData: AnyObject?
let status = SecItemCopyMatching(keyChainQuery, &extractedData)

if (status == errSecSuccess) 
    retrievedData = extractedData as? NSData

【讨论】:

似乎编译得很好!你能解释一下你是如何得出这个解决方案的吗?编译器想要一个: UnsafeMutablePointer> 但显然 AnyObject?也可以吗? 见this document。我们可以将 in-out(&amp;) 表达式传递给UnsafeMutablePointer&lt;T&gt; 参数。当它接受UnsafeMutablePointer&lt;Optional&lt;AnyObject&gt;&gt; 时,如果resultOptional&lt;AnyObject&gt; 又名AnyObject? 变量,我们可以传递&amp;result【参考方案2】:

在困惑了一些之后,我想出了这个解决方案:

    var retrievedData: NSData?
    let sizeOfKey = 32
    let store = UnsafeMutablePointer<AnyObject?>.alloc(sizeof(AnyObject?) * sizeOfKey)
    let status = SecItemCopyMatching(keyChainQuery, store)

    if (status == errSecSuccess) 
        retrievedData = NSData(bytesNoCopy: store, length: sizeOfKey, freeWhenDone: true)
    

编译。我不确定它是否真的有效。如果是这样,我会更新这篇文章。同时,如果知道的人可以对此发表评论,那就太好了!

【讨论】:

以上是关于SecItemCopyMatching 的 swift 2.0 钥匙串类型错误的主要内容,如果未能解决你的问题,请参考以下文章

来自命令行的 xcodebuild - 权利问题 -SecItemCopyMatching:缺少权利

SecItemCopyMatching 的 swift 2.0 钥匙串类型错误

SecItemCopyMatching 返回 nil 值而没有任何错误

SecItemAdd 和 SecItemCopyMatching 返回错误代码 -34018 (errSecMissingEntitlement)

iOS 9:SecItemCopyMatching 返回成功状态码,但键为 nil

Keychainitemwrapper 类中的 SecItemCopyMatching 条件失败,因此无法检索钥匙串中保存的值