1

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....

4

1 に答える 1

1

そのコンパイルエラーは私にはバグのようです。(これは、すべての CF タイプが の typealiases としてインポートされたときに有効な診断でしたAnyObject。)

しかし、あなたの場合、私は次のようにします:

let key = peerKeyRef as! SecKeyRef?

クエリが返すことを 100% 確信していますSecKeyRefnil、いいえ?

于 2016-08-01T20:46:51.143 に答える