gpt4 book ai didi

objective-c - 从 AnyObject 转换时出错?到 SecKeyRef?在 swift

转载 作者:行者123 更新时间:2023-11-28 06:37:46 26 4
gpt4 key购买 nike

作为基于 Swift 的 PKI 实现的一部分,我将 SecKeyWrapper.m 移植到了 Swift

Keychain 访问方法(Objective-C 和 Swift)都工作正常,除了 Swift 实现中的一部分。

我从对端收到 base64 格式的公钥。它被转换为 NSData,然后使用以下方法保存在钥匙串(keychain)中:

statusCode = SecItemAdd(queryDictionary, &persistentPeer)

成功将对端公钥保存在钥匙串(keychain)中后,我需要将其作为 SecKeyRef 获取。

    queryDictionary[kSecReturnPersistentRef] = true
var peerKeyRef: AnyObject?
statusCode = SecItemCopyMatching(queryDictionary, &peerKeyRef)

问题是 SecItemCopyMatching 返回的是 AnyObject 类型的对象?不能转换为 SecKeyRef(或者 SecKey 那是一个别名)

let key = peerKeyRef as? SecKeyRef // Compile error.

我发现的解决方法是将 peerKeyRef 转换为 NSObject?然后使用 Objective-C 桥接到 SecKey,如下所示:

let keyObject = peerKeyRef as? NSObject
keyRef = Utility.getSecKeyRefFromAnyObject(keyObject).takeRetainedValue()

Objetive-C 代码如下:

+(SecKeyRef) getSecKeyRefFromNSObject:(id)theObject {
return (__bridge SecKeyRef)theObject;
}

使用此变通办法转换为 SecKey 工作正常(没有警告或错误)并获得预期结果。

您认为在转换 AnyObject 的 Swift 代码中缺少什么?到 SecKeyRef?

我正在使用 Xcode 7.3.1 和 Swift 2.2

Rgds....

最佳答案

那个编译错误对我来说似乎是一个错误。(当所有 CF 类型都作为 AnyObject 的类型别名导入时,这曾经是一个有效的诊断。)

但在你的情况下,我会这样做:

let key = peerKeyRef as! SecKeyRef?

您 100% 确定查询返回 SecKeyRefnil,不是吗?

关于objective-c - 从 AnyObject 转换时出错?到 SecKeyRef?在 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38706955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com