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<>
工作了。
试试:
var retrievedData: NSData?
var extractedData: AnyObject?
let status = SecItemCopyMatching(keyChainQuery, &extractedData)
if (status == errSecSuccess)
retrievedData = extractedData as? NSData
【讨论】:
似乎编译得很好!你能解释一下你是如何得出这个解决方案的吗?编译器想要一个: UnsafeMutablePointer&
) 表达式传递给UnsafeMutablePointer<T>
参数。当它接受UnsafeMutablePointer<Optional<AnyObject>>
时,如果result
是Optional<AnyObject>
又名AnyObject?
变量,我们可以传递&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 条件失败,因此无法检索钥匙串中保存的值