MonoTouch не может получить значение существующего элемента цепочки для ключей - PullRequest
3 голосов
/ 28 февраля 2012

Я не могу получить значение из цепочки для ключей, поскольку оно всегда возвращает ItemNotFound. Код, который я использую, выглядит следующим образом:

private static Guid GetID()
    {           
        Guid returnGuid = Guid.Empty;
        SecStatusCode code;
        SecRecord queryRec = new SecRecord (SecKind.GenericPassword) { Service = KEYCHAIN_SERVICE, Label = KEYCHAIN_SERVICE, Account = KEYCHAIN_ACCOUNT };
        queryRec = SecKeyChain.QueryAsRecord (queryRec, out code);

        if (code == SecStatusCode.Success && queryRec != null && queryRec.Generic != null )
        {
            returnGuid = new Guid(NSString.FromData(queryRec.Generic, NSStringEncoding.UTF8));
        }

        return returnGuid;

    }

Когда я пытаюсь установить значение, он возвращает DuplicateItem со следующим кодом:

private static SecStatusCode SetID (Guid setID)
    {           
        SecStatusCode code = SecKeyChain.Add (new SecRecord (SecKind.GenericPassword) {
            Service = KEYCHAIN_SERVICE,
            Label = KEYCHAIN_SERVICE,
            Account = KEYCHAIN_ACCOUNT,
            Generic = NSData.FromString(Convert.ToString(setID), NSStringEncoding.UTF8),
            Accessible = SecAccessible.Always
        } );

        return code;
    }

Любая помощь будет отличной!

1 Ответ

3 голосов
/ 28 февраля 2012

Я скопировал ваш код в 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 при тестировании этого.

...