キーチェーンにユーザー名とパスワードが保存されているかどうかを確認する次のメソッドがあります。
- (BOOL)hasLoginDetails
{
FLog
NSString *username = [self.keychainItem objectForKey:(__bridge id)kSecAttrAccount];
if (username == nil || [username isEqualToString:@""])
return NO;
NSData *passData = [self.keychainItem objectForKey:(__bridge id)kSecValueData];
if (passData == nil || [passData length] == 0)
return NO;
NSString *password = [[NSString alloc] initWithData:passData encoding:NSUTF8StringEncoding];
if (password == nil || [password isEqualToString:@""])
return NO;
return YES;
}
password が返されるNSData
ため、文字列に変換する必要があります。これは通常の使用では問題なく動作しますが、バックグラウンドapplication:performFetchWithCompletionHandler:
メソッドで使用すると、次の行を指すクラッシュが発生することがあります。
NSString *password = [[NSString alloc] initWithData:passData encoding:NSUTF8StringEncoding];
クラッシュログは不平を言う
-[__NSCFString bytes]: unrecognized selector sent to instance 0x156104a0
AdHoc ビルドを配布した後にのみ、これらのクラッシュが発生します。passData
この時点で変数が実際には文字列であるとクラッシュログが言っていると思いますか? ここで何が起こっているのですか?
ありがとう
編集 - -
パスワードは、単に[self.keychainItem setObject:password forKey:(__bridge id)kSecValueData];
password
NSString であることを使用してキーチェーンに追加されます。ここから KeychainItemWrapper を使用しています。これは、パスワード NSString を NSData に変換しますが、再度変換しないため、私はそれを行っています。
編集 2 ----
デバッグ クラッシュの後、passData 変数をチェックすると、実際には NSData であるべき NSString でした。