0

この問題の解決策を探していましたが、このような問題に遭遇したのはインターネット上で私だけのようです。

Appleが提供するキーチェーンラッパークラスを使用して、ユーザーとパスワードを保存する必要があります。ユーザーの値を取り戻したいときは、次のように簡単です。

NSString *user = [keychain objectForKey:(id)kSecAttrAccount];

パスワードの取得は、ユーザー名と同じくらい簡単です。

NSString *pass = [keychain objectForKey:(id)kSecValueData];

しかし、その後、NSLog でそれらを印刷しようとすると、パスの後、コンソールには何も表示されません。例えば:

NSLog(@"user: <%@>, pass: <%@>, something after the pass", user, pass);

この NSLog の出力は次のとおりです。

user: <123456>, pass: <5433

[パスの長さ] を呼び出すと、パスの実際の長さよりも常に大きい数値が得られます (この例では、パスの長さが実際には 4 であると言えますが、この例では 10 です)。

何が起こっているのかわかりません。適切な解決策を見つけようとしている間に、この問題にパッチを当てる回避策を作成しました(すべての文字の整数値を調べ、数字、文字、およびいくつかの記号のみを許可します)。

前もって感謝します!

4

2 に答える 2

1

ここでの問題は、CFDataRef オブジェクトを NSString オブジェクトとして格納しようとしていて、%@ を使用して文字列として出力しようとしていることです。文字列ではなく、データ オブジェクトです。文字列として表示したい場合は、最初に文字列に変換する必要があります。ログに記録する前に、以下のコードのようなものを試して文字列に変換してください。

NSData *passData = [keychain objectForKey:(id)kSecValueData];
NSString *pass = [[NSString alloc] initWithBytes:[passData bytes] length:[passData length] encoding:NSUTF8StringEncoding];
于 2012-10-22T18:41:49.427 に答える
0

kSecValueData の型は次のとおりです: typedef const void * CFTypeRef;

NSString に型キャストしないでください。このように NSLog に直接投稿してみてください。

NSLog(@"user <%@> pass <%@>", [keychain objectForKey:(id)kSecAttrAccount], [keychain objectForKey:(id)kSecValueData]);

幸運を!

于 2012-06-15T08:14:27.377 に答える