Я скопировал ваш код в Touch.Unit решение, и оно работает как на симуляторе, так и на устройствах.
[Test]
public void CheckId ()
{
Guid g = Guid.NewGuid ();
SetID (g);
Assert.That (g, Is.EqualTo (GetID ()), "same guid");
}
Единственное, что мне пришлось изменить, это ваш KEYCHAIN_*
константы для строк, я сохранил те же значения (то есть просто добавил кавычки).
Теперь, если вы выполните код секунду раз, вы получите код ошибки DuplicateItem
,потому что SetID
пытается установить тот же элемент снова, и когда вы запросите Guid
, вы получите первый - что приведет к ошибке.
У вас есть два варианта, удалить существующий элемент или обновить его.Например, чтобы удалить существующий элемент ...
static SecStatusCode SetID (Guid setID)
{
SecRecord queryRec = new SecRecord (SecKind.GenericPassword) {
Service = "KEYCHAIN_SERVICE",
Label = "KEYCHAIN_SERVICE",
Account = "KEYCHAIN_ACCOUNT"
};
var record = new SecRecord (SecKind.GenericPassword) {
Service = "KEYCHAIN_SERVICE",
Label = "KEYCHAIN_SERVICE",
Account = "KEYCHAIN_ACCOUNT",
Generic = NSData.FromString (Convert.ToString (setID), NSStringEncoding.UTF8),
Accessible = SecAccessible.Always
};
SecStatusCode code = SecKeyChain.Add (record);
if (code == SecStatusCode.DuplicateItem) {
code = SecKeyChain.Remove (queryRec);
if (code == SecStatusCode.Success)
code = SecKeyChain.Add (record);
}
return code;
}
Примечание: я никогда не получал ItemNotFound
при тестировании этого.