3

うまく機能しているように見えるiOS キーチェーン 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に戻すことで、これを回避しました. しかし今、それが現実的ではない別の状況に遭遇しました。

なぜこうなった?私の抽象化は漏れていますか?

4

0 に答える 0