2011-11-08 39 views
10

Tôi vừa tìm thấy một vấn đề thú vị với ứng dụng của mình. Trong ứng dụng tôi đang lưu tên người dùng và mật khẩu của người dùng vào keychain.iOS KeychainItemWrapper không cập nhật

keychainWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyLoginPassword" accessGroup:nil]; 

[keychainWrapper setObject:usernameField.text forKey:(id)kSecAttrAccount]; 
[keychainWrapper setObject:passwordField.text forKey:(id)kSecValueData]; 

Khi mã này được chạy trong Gỡ lỗi có vẻ như chỉ hoạt động tốt. Nó cập nhật mỗi lần và sau này tôi có thể lấy các mục từ móc khóa. Khi nó được chạy trong phân phối tuy nhiên keychain không bao giờ được cập nhật. Tôi đã xác minh rằng có những dòng mã được nhấn trong cả hai xây dựng. Tôi đang sử dụng Xcode 4.2 với SDK iOS5 và chạy ứng dụng trên iPad 2 đã cài đặt iOS5.

Trả lời

16

Tôi cũng có vấn đề này, và nó đã cho tôi mãi mãi để tìm ra

Có một phiên bản của "KeychainWrapper" nổi xung quanh đó đã nó SecItemUpdate trong một NSAssert (trong số những thứ khác).

Ai đã làm điều này là một moron !, khi xây dựng cho phát hành/phân phối mỗi NSAssert được vô hiệu hóa, có nghĩa là mã thậm chí không chạy.

Ví dụ:

NSAssert(SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck), @"Couldn't update the Keychain Item."); 

nhu cầu để trở thành

OSStatus status = SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck); 
NSAssert(status == noErr, @"Couldn't update the Keychain Item."); 

Thông báo như thế nào SecItemUpdate thực tế được chuyển ngoài NSAssert, và thay vào đó kết quả được kiểm tra

Lưu ý quan trọng: Cố để cập nhật giá trị cho kSecValueData, mà không chỉ định giá trị cho kSecAttrAccount, cũng sẽ khiến xác nhận thất bại. Vì vậy, nếu mục đích của bạn là để lưu trữ một chuỗi duy nhất của dữ liệu nhạy cảm (chẳng hạn như một danh sách các số thẻ tín dụng), hãy chắc chắn để lưu trữ một số "tên tài khoản" văn bản trong các thuộc tính kSecAttrAccount, như vậy:

static NSString* kCardListXML = @"cardListXML"; 
static NSString* cardListAccountName = @"cardListAccount"; 

-(void)setCardListXML:(NSString*)xml { 
    KeychainItemWrapper* wrapper = 
    [[KeychainItemWrapper alloc] initWithIdentifier:kCardListXML accessGroup:nil]; 
    [wrapper setObject:cardListAccountName forKey:(id)CFBridgingRelease(kSecAttrAccount)]; 
    [wrapper setObject:xml forKey:(id)CFBridgingRelease(kSecValueData)]; 
}  

-(NSString*)getCardListXML { 
    KeychainItemWrapper* wrapper = 
    [[KeychainItemWrapper alloc] initWithIdentifier:kCardListXML accessGroup:nil]; 
    [wrapper setObject:cardListAccountName forKey:(id)CFBridgingRelease(kSecAttrAccount)]; 
    return [wrapper objectForKey:CFBridgingRelease(kSecValueData)]; 
} 
+0

Tôi đã tìm ra và đây chính là vấn đề. Cảm ơn. – iHorse

+0

Điều đó dường như được sửa trong v1.2 của KeychainWrapper, có sẵn từ Mã mẫu Xcode – Olaf

14

khi bạn đưa

keychainWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyLoginPassword" accessGroup:nil]; 

[keychainWrapper setObject:usernameField.text forKey:(id)kSecAttrAccount]; 
[keychainWrapper setObject:passwordField.text forKey:(id)kSecValueData]; 

bạn cũng phải bao gồm

[keychainWrapper setObject:@"Myappstring" forKey: (id)kSecAttrService]; 

Hoặc tôi nhận được một lỗi "SIGABRT". (Myappstring) là một chuỗi xác định ứng dụng của bạn.

Có thể tôi đang thiếu điều gì đó, điều này nên được thực hiện ít nhất một lần.

+0

KeychainItemWrapper chủ yếu làm việc cho tôi, làm việc trên nhiều địa chỉ email (được lưu trữ dưới dạng tên người dùng trong kSecAttrAccount), nhưng một email nói riêng không hoạt động. Sau đó tôi đã thêm dòng trên cho kSecAttrService và tất cả bây giờ là hoàn hảo! -Cảm ơn bạn @Andres – dbDev

+0

Tôi đã vật lộn với nó trong một thời gian dài. Vui mừng nó đã giúp –

+1

Sửa chữa này làm việc cho tôi. Thật khó để tìm ra những gì đang diễn ra từ các thông báo lỗi, bởi vì nếu trước đây bạn đã đặt chính xác các giá trị này, bạn sẽ không thấy lỗi. Chỉ khi bạn thay đổi initWithIdentifier: value AND không thiết lập kSecAttrService thì bạn bắt đầu nhận được lỗi. – carbocation

Các vấn đề liên quan