在Swift中的CFDictionaryRef问题

我正在将一些旧的Objective-C代码转换成Swift,所以我可以从一些不赞成使用的方法转移,但我一直在崩溃,到目前为止我似乎无法弄清楚是什么导致了它。 我得到一个P12证书的私钥,这种方法似乎工作得很好,直到我真正需要从CFArray获取字典的部分,即使数组中有值的应用程序不断崩溃。 这里是我有的代码:

func privateKeyFromCertificate(p12Name: String, withPassword password: String) -> SecKeyRef { let resourcePath: String = NSBundle.mainBundle().pathForResource(p12Name, ofType: "p12")! let p12Data: NSData = NSData(contentsOfFile: resourcePath)! let key : NSString = kSecImportExportPassphrase as NSString let options : NSDictionary = [key : password] var privateKeyRef: SecKeyRef? = nil var items : CFArray? let securityError: OSStatus = SecPKCS12Import(p12Data, options, &items) let description : CFString = CFCopyDescription(items) print(description) if securityError == noErr && CFArrayGetCount(items) > 0 { let objects : CFDictionaryRef = CFArrayGetValueAtIndex(items, 0) as! CFDictionaryRef let kString : NSString = kSecImportItemIdentity as NSString let identity : SecIdentityRef = CFDictionaryGetValue(objects, unsafeAddressOf(kString)) as! SecIdentityRef let securityError = SecIdentityCopyPrivateKey(identity, &privateKeyRef) if securityError != noErr { privateKeyRef = nil } } return privateKeyRef! } 

该应用程序不断崩溃在第一行if语句,我尝试从CFArray获取CFDictiionaryRef。 我添加了一行来打印CFArray的描述作为一个testing,它确实有值:

 <CFArray 0x7fd2d2e8c2f0 [0x10b61f7b0]>{type = mutable-small, count = 1, values = ( 0 : <CFBasicHash 0x7fd2d2e8c190 [0x10b61f7b0]>{type = mutable dict, count = 3,entries => 0 : <CFString 0x10bfdd2c0 [0x10b61f7b0]>{contents = "trust"} = <SecTrustRef: 0x7fd2d2e8ad30> 1 : <CFString 0x10bfdd300 [0x10b61f7b0]>{contents = "identity"} = <SecIdentityRef: 0x7fd2d2e80390> 2 : <CFString 0x10bfdd2e0 [0x10b61f7b0]>{contents = "chain"} = <CFArray 0x7fd2d2d016e0 [0x10b61f7b0]>{type = mutable-small, count = 1, values = ( 0 : <cert(0x7fd2d2e8c610) s: Client (IPHONE-WebService) i:Client (IPHONE-WebService)>)}} 

我最终改变了一些东西来获取数据,这不是最漂亮的方法,但它为我工作。

 func privateKeyFromCertificate() -> SecKeyRef { let certName : String = //name of the certificate// //get p12 file path let resourcePath: String = NSBundle.mainBundle().pathForResource(certName, ofType: "p12")! let p12Data: NSData = NSData(contentsOfFile: resourcePath)! //create key dictionary for reading p12 file let key : NSString = kSecImportExportPassphrase as NSString let options : NSDictionary = [key : "password_for_certificate"] //create variable for holding security information var privateKeyRef: SecKeyRef? = nil var items : CFArray? let securityError: OSStatus = SecPKCS12Import(p12Data, options, &items) //let description : CFString = CFCopyDescription(items) //print(description) let theArray : CFArray = items! if securityError == noErr && CFArrayGetCount(theArray) > 0 { let newArray = theArray as [AnyObject] as NSArray let dictionary = newArray.objectAtIndex(0) let secIdentity = dictionary.valueForKey(kSecImportItemIdentity as String) as! SecIdentityRef let securityError = SecIdentityCopyPrivateKey(secIdentity , &privateKeyRef) if securityError != noErr { privateKeyRef = nil } } return privateKeyRef! }