http://log.scifihifi.com/post/55837387/simple-iphone-keychain-code
で提供されている、SFHFKeychainUtils.hとmを使えば簡単ということなんだけど、これまたARC対応じゃないんだこれが・・・orz
いろいろ対処法があるんだろうと思うんですが、面倒なので急がば回れでちまちま治しました。
基本的に、release]やらautorelease]をどんどん消していって、Xcodeの◎を押して勝手に直させればいいんだけれど、最後、ポインターのポインターがダメ?
error: cast of an indirect pointer to an Objective-C pointer to 'CFTypeRef *' (aka 'const void **') is disallowed with ARC [4]
が少し悩んだ。 が、ここ↓
http://stackoverflow.com/questions/7827730/iphone-fetch-data-dictionary-from-keychain
を見て治しました。 すごいなあ。
CFDictionaryRef cfresult = NULL;
NSMutableDictionary *attributeQuery = [query mutableCopy];
[attributeQuery setObject: (id) kCFBooleanTrue forKey:(__bridge id) kSecReturnAttributes];
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef) attributeQuery, (CFTypeRef *) &cfresult);
NSMutableDictionary *attributeQuery = [query mutableCopy];
[attributeQuery setObject: (id) kCFBooleanTrue forKey:(__bridge id) kSecReturnAttributes];
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef) attributeQuery, (CFTypeRef *) &cfresult);
って感じで。
resultDataんとこは要るみたいなのでSecItemCopyMatchingの後で、
NSData *resultData = (__bridge_transfer NSData *)cfresult2;
って感じ。
cfresult2 は、CFDataRefです。
「って感じ」ばっかりだけど、とりあえず大丈夫っぽい。
しかし、どうなんだろう???このkeychainアクセス。
forServiceNameが自由に設定できるところが、セキュリティーとしてはやや弱いように思えるんだが・・・
もちろん、平文でNSUserDefaultsにパスワード保存がマズイのはわかるが、破り方によってはNSUserDefaultsよりも怖い気がする。
一応、forServiceNameは安易なアプリ名にしないほうが良いと思うのですが、あんまり書いてあるとこ無いので、書いとこうと思いました。
まあきっと僕がよくわかっていないのだろう。 推奨の方法なのでヨシとしよう。
同様の問題で困っていたところを、本記事のおかげで解決できました! ありがとうございます。
返信削除