为什么iOS Keychain值不会在不离开ViewController的情况下改变?

时间:2013-02-07 00:41:48

标签: iphone ios xamarin.ios

an abstraction on the iOS Keychain API似乎运作良好。基本上,它有:

public string GetGenericPasswordField(string account)
{
    var record = SecKeyChain.QueryAsRecord(query, out code);
    if (code == SecStatusCode.ItemNotFound)
        return null;
    return NSString.FromData(record.ValueData, NSStringEncoding.UTF8);
}

public void SetGenericPasswordField(string account, string value)
{
    if (value == null)
    {
        SecKeyChain.Remove(record);
        return;
    }
    var record = new SecRecord (SecKind.GenericPassword) {
        Service = service,
        Label = label,
        Account = account,
        ValueData = NSData.FromString (value),
    };
    SecStatusCode code = SecKeyChain.Add (record);
    if (code == SecStatusCode.DuplicateItem)
    {
        // (remove and re-add item)
    }
}

我在应用程序的设置屏幕上使用了这个抽象来保存值,同时在应用程序的其他地方加载这些值。

但是我遇到了一个问题,如果不离开当前的ViewController,保存值似乎不会生效。我正在做的是类似于:

if (Keychain.GetGenericPasswordField("RemoteLogin") == null)
{
    var remotePassword = GetFromDialog();
    Keychain.SetGenericPasswordField("RemoteLogin", Hash(remotePassword));
    // Safe to assume the RemoteLogin password got saved, right?
}

// Later on...

if (Keychain.GetGenericPasswordField("RemoteLogin") == null)
{
    // This block is being executed
}

我已经逐步调试了调试器中的代码,以确认事情正如我所描述的那样,并且我的抽象方法确实得到了SecStatusCode.ItemNotFound,这意味着null是返回的适当值。

我通过将我的代码的前半部分移回到之前的ViewController来解决这个问题,并且由于某种原因似乎将其唤醒,或清除了正在发生的任何缓存。但现在我遇到了另一种不太实际的情况。

为什么会这样?我的抽象漏洞了吗?

0 个答案:

没有答案