作为基于Swift的PKI实现的一部分,我将SecKeyWrapper.m移植到Swift
密钥链访问方法的目标C和Swift都很好,除了Swift实现的一部分之外。
我以base64格式接收来自对等方的公钥。它被转换为NSData,然后使用以下方法保存在密钥链中:
statusCode = SecItemAdd(queryDictionary, &persistentPeer)在成功地将对等公钥保存到密钥链中之后,我需要将其作为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连接到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和SWIFT2.2
Rgds..。
发布于 2016-08-01 20:46:51
对我来说,编译错误似乎是个错误。(当所有CF类型都作为AnyObject的类型别名导入时,这曾经是一个有效的诊断。)
但在你的情况下,我会这样做:
let key = peerKeyRef as! SecKeyRef?您100%确信查询返回SecKeyRef或nil,不是吗?
https://stackoverflow.com/questions/38706955
复制相似问题