我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来解决这个问题,并且由于某种原因似乎将其唤醒,或清除了正在发生的任何缓存。但现在我遇到了另一种不太实际的情况。
为什么会这样?我的抽象漏洞了吗?