2016-08-01 5 views
0

Dans le cadre d'une implémentation PKI basée Swift, j'ai porté le SecKeyWrapper.m à SwiftErreur de diffusion depuis AnyObject? à SecKeyRef? à Swift

deux, (Objective-C et Swift) des méthodes d'accès porte-clés fonctionnent bien, sauf une part à la mise en œuvre rapide.

Je reçois la clé publique de l'homologue au format base64. Il est converti en NSData puis enregistré dans le trousseau en utilisant:

statusCode = SecItemAdd(queryDictionary, &persistentPeer) 

Après avoir enregistré avec succès la clé publique par les pairs dans le trousseau, je dois l'obtenir comme SecKeyRef.

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

Le problème est que SecItemCopyMatching renvoie un objet de type AnyObject? que ne peux pas être casté en SecKeyRef (ou SecKey des thats est un alias)

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

Le travail autour j'ai trouvé est de jeter le peerKeyRef comme NSObject? puis utiliser Objective-C pour combler à SecKey comme suit:

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

Le code objectif Objectif-C pour le faire est la suivante:

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

Le casting à SecKey utilisant cette solution de contournement fonctionne très bien (pas avertissements ou erreurs) avec le résultat attendu. D'après vous, que manque-t-il dans le code Swift pour lancer AnyObject?

à SecKeyRef?

Je travaille avec Xcode 7.3.1 et Swift 2.2

Mfg ....

Répondre

1

Cette erreur de compilation semble être un bug pour moi. (qui était autrefois un diagnostic valable lorsque tous les types de FC ont été importés en tant que typealiases de AnyObject.)

Mais dans votre cas, je voudrais juste faire comme:

let key = peerKeyRef as! SecKeyRef? 

Vous êtes 100% sûr que la requête renvoie SecKeyRef ou nil, non?

+0

Salut @ OOper.let key = pairKeyRef as! SecKeyRef? – eharo2

+0

Désolé ... commentaire incomplet ... Thx @OOper ... Cela fonctionne. Pour une raison quelconque, "peerKeyRef as? SecKeyRef" échoue, mais "peerKeyRef as! SecKeyRef?" fonctionne bien ..... Thx beaucoup ..... – eharo2

+0

@ eharo2, s'il vous plaît ne vous inquiétez pas, à mon avis, 'as?' devrait fonctionner où 'as!' est valide. Mais, "pour une raison quelconque", cela ne fonctionne pas. Je n'ai pas vérifié avec le dernier Xcode 8 (beta 4, comme pour l'instant), mais si vous trouvez le même comportement dans le dernier Xcode 8, vous devriez envoyer un [Bug Report] (http://developer.apple.com/bug-reporting /) à Apple. – OOPer