Ajout d'un objet au trousseau en utilisant Swift
Je suis en train d'ajouter un élément à l'iOS de keychain de l'utilisation de Swift, mais ne peut pas comprendre comment le type cast correctement. À partir de la WWDC 2013 session 709, compte tenu de la suite de code Objective-C:
NSData *secret = [@"top secret" dataWithEncoding:NSUTF8StringEncoding];
NSDictionary *query = @{
(id)kSecClass: (id)kSecClassGenericPassword,
(id)kSecAttrService: @"myservice",
(id)kSecAttrAccount: @"account name here",
(id)kSecValueData: secret,
};
OSStatus = SecItemAdd((CFDictionaryRef)query, NULL);
Tenter de le faire en Swift comme suit:
var secret: NSData = "Top Secret".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
var query: NSDictionary = [
kSecClass: kSecClassGenericPassword,
kSecAttrService: "MyService",
kSecAttrAccount: "Some account",
kSecValueData: secret
]
donne le message d'erreur "Impossible de convertir l'expression du type "Dictionnaire" à "DictionaryLiteralConvertible'.
Une autre approche que j'ai pris est d'utiliser Swift et la - setObject:forKey:
méthode sur un Dictionnaire pour ajouter kSecClassGenericPassword avec la clé kSecClass.
En Objective-C:
NSMutableDictionary *searchDictionary = [NSMutableDictionary dictionary];
[searchDictionary setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
Dans le code Objective-C, le CFTypeRef des différents trousseau classe de l'élément clés sont comblé à l'aide de l'id. Dans la Swift la documentation il est mentionné que Swift importations id AnyObject. Cependant lorsque j'ai voulu abattu kSecClass comme AnyObject pour la méthode, j'obtiens l'erreur "Type " AnyObject' n'est pas conforme à NSCopying.
Toute aide, si c'est une réponse directe ou quelques conseils sur la façon d'interagir avec les principaux types de Fondation serait appréciée.
EDIT 2
Cette solution n'est plus valable à compter de Xcode 6 Bêta 2. Si vous utilisez la version Beta 1 le code ci-dessous peuvent travailler.
var secret: NSData = "Top Secret".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let query = NSDictionary(objects: [kSecClassGenericPassword, "MyService", "Some account", secret], forKeys: [kSecClass,kSecAttrService, kSecAttrAccount, kSecValueData])
OSStatus status = SecItemAdd(query as CFDictionaryRef, NULL)
À utiliser Trousseau d'Attribut d'Élément clés, comme les clés de dictionnaire que vous avez à les déballer en utilisant takeRetainedValue ou takeUnretainedValue (selon le cas). Ensuite, vous pouvez les jeter à NSCopying. C'est parce qu'ils sont CFTypeRefs dans l'en-tête, qui ne sont pas copiable.
De Xcode 6 Bêta 2 toutefois, cela provoque Xcode pour crash.
source d'informationauteur Pasan Premaratne
Vous devez vous connecter pour publier un commentaire.
Dans xcode 6.0.1 vous devez le faire!!
Vous devez simplement abattu le littéral:
Maintenant
dict
est un NSDictionary. Pour faire une mutable, c'est très similaire à Objective-C:Peut-être les choses se sont améliorées depuis. Sur Xcode 7 bêta 4, pas de casting semble être nécessaire, sauf lorsqu'ils traitent avec le résultat
AnyObject?
. Plus précisément, la suite semble fonctionner:Pour ajouter une touche si il manquait:
Quelques choses à remarquer: votre problème initial peut-être que la
str.dataUsingEncoding
renvoie une Option. L'ajout de '!' ou, mieux encore, à l'aide d'unif let
pour gérer néant en retour, serait susceptible de rendre votre code de travail. L'impression du code d'erreur et la recherche dans les docs va beaucoup aider à isoler le problème (j'ai été faire err -50 = mauvais paramètre, jusqu'à ce que j'ai remarqué un problème avec mon kSecClass, rien à voir avec les types de données ou en jette!).Tout semblait aller bien, ou au moins compilateur n'a pas de chatons - non testé-delà
Semble bien fonctionner dans la version Bêta 2 de
Afin d'obtenir que cela fonctionne, vous devez accéder à la valeur retenue du trousseau des constantes de la place. Par exemple:
Vous pouvez ensuite faire référence aux valeurs dans le MSMutableDictionary comme suit:
J'ai écrit un billet de blog à ce sujet:
http://rshelby.com/2014/08/using-swift-to-save-and-query-ios-keychain-in-xcode-beta-4/
Espérons que cette aide!
rshelby
Swift 3
vous pouvez aussi le faire à l'intérieur du dictionnaire lui-même alá:
cependant, c'est plus cher pour le compilateur, d'autant plus que vous êtes probablement à l'aide de la requête en plusieurs endroits.
plus pratique d'utiliser les gousses de cacao SSKeychain