2011-01-31 19 views
7

MODIFICA: il problema è stato risolto. Per contribuire un po 'alla comunità ho impostato alcuni metodi di supporto e un esempio su come usarli sul mio blog. Si trova qui KeyChain MT exampleMemorizzare e leggere la password per/da portachiavi utilizzando Monotouch

- domanda originale:

esecuzione iOS4.2 sul simulatore e iPad.

Sto tentando di memorizzare e leggere una password dal portachiavi utilizzando il codice riportato di seguito. La mia ispirazione per il codice era https://github.com/ldandersen/scifihifi-iphone/ ma non riesco a farlo funzionare. Cosa mi manca?

// Create a record. 
SecRecord o = new SecRecord (SecKind.GenericPassword); 
o.Service = "myService"; 
o.Label = "myService"; 
o.Account = "[email protected]"; 
// The super secret password. 
o.Generic = NSData.FromString ("secret!", NSStringEncoding.UTF8); 
// Add to keychain. 
SecKeyChain.Add (o); 

// Now cerate another recored to query what we just saved. 
o = new SecRecord (SecKind.GenericPassword); 
o.Service = "myService"; 
o.Account = "[email protected]"; 

// Query as record.   
SecStatusCode code; 
var data = SecKeyChain.QueryAsRecord (o, out code); 

// This will tell us "all good!"... 
Console.WriteLine (code); 

// But data.Generic is NULL and this line will crash. :-(
Console.WriteLine (NSString.FromData (data.Generic, NSStringEncoding.UTF8)); 
+0

Buon post sul blog, molto utile, grazie! – vlad259

+0

È ancora il metodo accettato? – servarevitas3

+0

Il tuo link nel tuo post è rotto – Jake

risposta

5

Piuttosto che utilizzare SecRecord 's .ValueData provare questo:

Console.WriteLine(NSString.FromData(data.Generic, NSStringEncoding.ASCIIStringEncoding)); 

Generic rendimenti NSData da dove SecKind.GenericPassword' sono memorizzati s.

+0

Non funziona. Ho cambiato l'esempio sopra e ancora non funziona. – Krumelur

+1

Funziona ora! Ho capito che aggiungere lo stesso record due volte con password diverse non sovrascrive/aggiorna quello vecchio. Pertanto è rimasto nullo. È necessario utilizzare SecKeyChain.Update() per aggiornare i record esistenti. Molte grazie! – Krumelur

+0

Ho aggiunto un collegamento al mio blog che contiene un esempio funzionante e alcuni metodi di supporto. Forse aiuta gli altri. – Krumelur

Problemi correlati