1

キーチェーンにユーザー名とパスワードが保存されているかどうかを確認する次のメソッドがあります。

- (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]; passwordNSString であることを使用してキーチェーンに追加されます。ここから KeychainItemWrapper を使用しています。これは、パスワード NSString を NSData に変換しますが、再度変換しないため、私はそれを行っています。

編集 2 ----

デバッグ クラッシュの後、passData 変数をチェックすると、実際には NSData であるべき NSString でした。

4

2 に答える 2

0

この特定のエラーを探していると、この例外が発生することがわかりましinitWithData:encoding:NSStringNSData

認識できないセレクターが NSKeyedUnarchiver のインスタンスに送信されました:ソース

コードをチェックインしてください。パスワードを保存するとき、文字列として保存しますか? 読む必要がない場合はinitWithData:encoding:、そのまま読むか、NSString initWithString:

于 2014-03-11T18:11:02.427 に答える