2015-01-20 15 views
5

Tôi có một ứng dụng iOS lưu trữ mã thông báo truy cập trong Keychain. Trong vài tháng qua, tôi đã nhận thấy rằng khoảng 2% người dùng nhận được errSecItemNotFound khi cố truy xuất mã thông báo.Phần trăm nhỏ người dùng nhận được errSecItemNotFound khi truy xuất dữ liệu từ Keychain

Tất cả các luồng StackOverflow có liên quan trỏ tới các tác vụ nền là thủ phạm (iOS KeyChain not retrieving values from background) hoặc bao gồm các thông số không hợp lệ trong chuỗi truy vấn (Keychain: Item reported as errSecItemNotFound, but receive errSecDuplicateItem on addition).

Tôi đang sử dụng kSecAttrAccessibleAfterFirstUnlock để các tác vụ nền có thể truy cập vào Keychain.

Hơn nữa, các truy vấn tìm kiếm trông như thế này:

NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; 
[query setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; 
[query setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; 
[query setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; 
[query setObject:service forKey:(__bridge id)kSecAttrService]; 
[query setObject:key forKey:(__bridge id)kSecAttrGeneric]; 
[query setObject:key forKey:(__bridge id)kSecAttrAccount]; 

(Thiết kSecAttrGeneric có lẽ là không cần thiết, nhưng nó không ảnh hưởng đến kết quả của truy vấn anyway)

Đối với hồ sơ, tôi đã trải qua lỗi này với cả hai số SSKeyChainUICKeychainStore.

Mọi gợi ý sẽ được đánh giá cao:]

+0

hi !! Tôi đang có exacly cùng một vấn đề ... Có UICKeyChainStore lib giải quyết này? Cảm ơn!! – Jovem

Trả lời

4

Tôi đã sử dụng KDJKeychainItemWrapper và có các sự cố tương tự. Cuối cùng, tôi đã thay thế việc sử dụng kSecAttrGeneric để sử dụng kSecAttrService. Điều này cố định tất cả các vấn đề của tôi không tìm mục và trùng lặp do dịch vụ không được xác định.

Tôi tin rằng các khóa chính cho kSecClassGenericPassword chỉ là kSecAttrAccount và kSecAttrService.

Nếu bạn chuyển sang không sử dụng kSecAttrGeneric, nó sẽ tự sắp xếp với có lẽ người dùng phải đặt lại mật khẩu của họ.

Cũng chọn tên dịch vụ sẽ không xung đột với bất kỳ thứ gì khác.

+0

Lưu ý rằng tôi cũng đã sử dụng kSecAttrService (kSecAttrService + kSecAttrAccount + kSecAttrGeneric). Không nên bổ sung (và dư thừa) kSecAttrGeneric thuộc tính được bỏ qua? – mgv

+0

Khóa có vẻ là tài khoản và dịch vụ đó phải là duy nhất như một cặp. Nếu không thì bạn chạy nguy hiểm của họ bị ghi đè hoặc bị loại bỏ ở một nơi khác. Tôi đã theo dõi lại nơi tôi nhìn thấy điều này ban đầu: http://useyourloaf.com/blog/2010/04/28/keychain-duplicate-item-when-adding-password.html –

+0

Tuy nhiên, bạn đã đúng với điều kiện bạn đã sử dụng tất cả 3 và bạn đang thiết lập AttrGeneric với cùng giá trị như AttrAccount nó sẽ hoạt động ngay cả khi AttrGeneric bị bỏ qua. Do lỗi của bạn dường như không được tìm thấy, nó có thể ngụ ý mục nhập đã được thay đổi ở một nơi khác. Giá trị của bạn cho khóa AttrService có phải là một giá trị độc đáo hay không? Bất kỳ cách nào nó có thể được thiết lập để @ "" nói hoặc bị hỏng khi cập nhật mà sau đó sẽ dẫn đến một thất bại trong thời gian tới truy vấn của nó? –

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