2014-12-21 18 views
8

Vì vậy, tôi có một khóa truy cập nhạy cảm cũ hiện có khả năng truy cập kSecAttrAccessible WhenUnlocked và tôi muốn cập nhật nó thành kSecAttrAccessibleAfterFirstUnlock.kSecAttrAccessibleAfterFirstUnlock không cho phép truy cập ngay cả sau lần đầu tiên mở khóa iOS

Tôi đang sử dụng Lockbox và gọi đây là:

[Lockbox setString:accessKey forKey:self.accessKeyName accessibility:kSecAttrAccessibleAfterFirstUnlock]; 

nào đến lượt mình, gọi điều này là:

-(BOOL)setObject:(NSString *)obj forKey:(NSString *)key accessibility:(CFTypeRef)accessibility 
{ 
    OSStatus status; 

    NSString *hierKey = [self _hierarchicalKey:key]; 

    // If the object is nil, delete the item 
    if (!obj) { 
     NSMutableDictionary *query = [self _query]; 
     [query setObject:hierKey forKey:(LOCKBOX_ID)kSecAttrService]; 
     status = SecItemDelete((LOCKBOX_DICTREF)query); 
     return (status == errSecSuccess); 
    } 

    NSMutableDictionary *dict = [self _service]; 
    [dict setObject: hierKey forKey: (LOCKBOX_ID) kSecAttrService]; 
    [dict setObject: (LOCKBOX_ID)(accessibility) forKey: (LOCKBOX_ID) kSecAttrAccessible]; 
    [dict setObject: [obj dataUsingEncoding:NSUTF8StringEncoding] forKey: (LOCKBOX_ID) kSecValueData]; 

    status = SecItemAdd ((LOCKBOX_DICTREF) dict, NULL); 
    if (status == errSecDuplicateItem) { 
     NSMutableDictionary *query = [self _query]; 
     [query setObject:hierKey forKey:(LOCKBOX_ID)kSecAttrService]; 
     status = SecItemDelete((LOCKBOX_DICTREF)query); 
     if (status == errSecSuccess) 
      status = SecItemAdd((LOCKBOX_DICTREF) dict, NULL); 
    } 
    if (status != errSecSuccess) 
     DLog(@"SecItemAdd failed for key %@: %d", hierKey, (int)status); 

    return (status == errSecSuccess); 
} 

Như bạn thấy ở trên, mã Lockbox dường như cố gắng thêm các mục nếu có một bản sao. Tôi đã đặt một điểm dừng ở đó và có thể xác nhận rằng nó hoạt động.

Tuy nhiên, đôi khi nó vẫn mang lại một lỗi của:

<Error>: SecOSStatusWith error:[-25308] The operation couldn’t be completed. (OSStatus error -25308 - Remote error : The operation couldn‚Äôt be completed. (OSStatus error -25308 - ks_crypt: e00002e2 failed to unwrap item (class 6, bag: 0) Access to item attempted while keychain is locked.)) 

Tôi không hiểu lý do tại sao tôi sẽ nhận được điều này - tôi đã mở khóa điện thoại của tôi và nó nên được làm việc tốt. Bất kỳ ý tưởng?

Tôi cũng nên thêm rằng tôi cần truy cập điều này khi ứng dụng bị giết và được khôi phục trong nền thông qua cập nhật theo dõi vùng.

+0

Xin chào, bạn đã giải quyết vấn đề này chưa? Tôi đang đối mặt với một vấn đề rất giống nhau. Truy cập keychain của tôi ném cùng một lỗi khi ứng dụng bị giết và khởi chạy ở chế độ nền – SeaJelly

+0

@SeaJelly bạn đã tìm giải pháp chưa? –

Trả lời

4

Tôi phải xóa khóa cũ trước khóa mới. Bạn có thể làm điều đó hoặc bạn có thể tạo một khóa mới với một tên khác với giá trị kSecAccessibility mới.

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