Xamarin.ios 使用Monotouch存储和读取钥匙链的密码

Xamarin.ios 使用Monotouch存储和读取钥匙链的密码,xamarin.ios,Xamarin.ios,编辑:问题已解决。为了对社区有所贡献,我在我的博客上设置了一些helper方法和一个如何使用它们的示例。在这里找到它 -- 原始问题: 在模拟器和iPad上运行iOS4.2 我正在尝试使用下面的代码存储和读取钥匙链中的密码。我对代码的灵感是,但我不能让它工作。我错过了什么 // Create a record. SecRecord o = new SecRecord ( SecKind.GenericPassword ); o.Service = "myService"; o.Label = "

编辑:问题已解决。为了对社区有所贡献,我在我的博客上设置了一些helper方法和一个如何使用它们的示例。在这里找到它

-- 原始问题:

在模拟器和iPad上运行iOS4.2

我正在尝试使用下面的代码存储和读取钥匙链中的密码。我对代码的灵感是,但我不能让它工作。我错过了什么

// Create a record.
SecRecord o = new SecRecord ( SecKind.GenericPassword );
o.Service = "myService";
o.Label = "myService";
o.Account = "test@test.com";
// 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 = "test@test.com";

// 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 ) );

不要使用
SecRecord
.ValueData
尝试以下方法:

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

Generic
返回存储
SecKind.GenericPassword
的NSData

不起作用。我已经改变了上面的例子,但仍然不起作用。现在起作用了!我发现用不同的密码添加两次相同的记录不会覆盖/更新旧记录。因此它仍然是空的。必须使用SecKeyChain.Update()更新现有记录。谢谢!我在我的博客上添加了一个链接,其中包含一个工作示例和一些助手方法。也许对别人有帮助。很好的博客帖子,很有用,谢谢!这仍然是被接受的方法吗?你帖子中的链接被破坏了