Swift ベースの PKI 実装の一部として、SecKeyWrapper.m を Swift に移植しました。
キーチェーン アクセス メソッドの両方 (Objective-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-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....