我正在尝试保存这样的记录:
var testRecord = new SecRecord(SecKind.GenericPassword)
{
CreationDate = DateTime.UtcNow,
MatchCaseInsensitive = false,
Service = "MyService",
Label = "MyService",
Account = "User",
Generic = NSData.FromString("test", NSStringEncoding.UTF8),
};
SecKeyChain.Add(testRecord);
...但是当我在模拟器中运行它时,我得到了SecStatusCode.Param。根据{{3}},该代码表示“传递的参数无效或不完整”,但我没有看到documentation没有取得明显成功的任何遗漏或异常。
甚至向SecRecord添加CreationDate,Invisible,Description,Comment,Accessible,和 ValueData属性(有些在others中)并没有帮助 - 仍然获得SecStatusCode.Param。
是否存在可能导致Param状态代码返回的非显而易见的事情?
答案 0 :(得分:10)
我在尝试使用钥匙串时遇到了很多麻烦。我终于让我的工作在应用程序中存储用户凭据。这就是我所拥有的:
SecRecord existingRec = new SecRecord (SecKind.GenericPassword) {
Service = Keychain.USER_SERVICE,
Label = Keychain.USER_LABEL
};
var record = new SecRecord (SecKind.GenericPassword) {
Service = Keychain.USER_SERVICE,
Label = Keychain.USER_LABEL,
Account = username,
ValueData = NSData.FromString (password),
Accessible = SecAccessible.Always
};
SecStatusCode code = SecKeyChain.Add (record);
if (code == SecStatusCode.DuplicateItem) {
code = SecKeyChain.Remove (existingRec);
if (code == SecStatusCode.Success)
code = SecKeyChain.Add (record);
}
Keychain是一个带常量的静态类,所以我不必重新键入字符串。
您和我之间唯一不同的是CreationDate
/ MatchCaseInsensitive
属性和NSData的编码。也许尝试没有那些,看看它是否有效?如果是这样,请单独添加它们,看看是什么原因造成的。
答案 1 :(得分:0)
这可能是因为您在模拟器上运行 - 在这种情况下,您需要在当前构建配置的项目选项中添加Entitlements plist,以便使Keychain访问工作。