5

私は次のようにレコードを保存しようとしています:

var testRecord = new SecRecord(SecKind.GenericPassword)
{
    CreationDate = DateTime.UtcNow,
    MatchCaseInsensitive = false,
    Service = "MyService",
    Label = "MyService",
    Account = "User",
    Generic = NSData.FromString("test", NSStringEncoding.UTF8),
};
SecKeyChain.Add(testRecord);

...しかし、シミュレーターで実行すると SecStatusCode.Param が返されます。ドキュメントによると、そのコードは「無効または不完全なパラメーターが渡された」ことを意味しますが、の人が明らかな成功を収めていないような欠落や異常は見当たりません。

CreationDate、Invisible、Description、Comment、Accessible、およびValueData の各プロパティを SecRecord に追加しても (この例のように) 役に立ちませんでした。依然として SecStatusCode.Param を取得しています。

Param ステータス コードが返される原因となる明らかでないものはありますか?

4

2 に答える 2

11

キーチェーンを使おうとしてかなり苦労しました。私は最終的に、アプリにユーザーの資格情報を保存するために私の仕事を手に入れました。ここに私が持っているものがあります:

        SecRecord existingRec = new SecRecord (SecKind.GenericPassword) { 
            Service = Keychain.USER_SERVICE, 
            Label = Keychain.USER_LABEL 
        };

        var record = new SecRecord (SecKind.GenericPassword) {
            Service = Keychain.USER_SERVICE, 
            Label = Keychain.USER_LABEL, 
            Account = username,
            ValueData = NSData.FromString (password),
            Accessible = SecAccessible.Always
        };

        SecStatusCode code = SecKeyChain.Add (record);
        if (code == SecStatusCode.DuplicateItem) {
            code = SecKeyChain.Remove (existingRec);
            if (code == SecStatusCode.Success)
                code = SecKeyChain.Add (record);
        }

キーチェーンは定数を持つ静的クラスなので、文字列を再入力する必要はありません。

あなたと私の唯一の違いは、CreationDate/MatchCaseInsensitiveプロパティと NSData のエンコーディングです。それらなしで試してみて、それが機能するかどうかを確認してください。その場合は、それらを個別に追加し直して、何が問題を引き起こしているかを確認してください。

于 2012-12-12T18:09:48.853 に答える