2015-02-27 2 views
3

Я видел в некоторых приложениях touchId, где на SecItemUpdate экран touchId UI никогда не появляется и обновление все еще происходит. Мне нужна аналогичная функциональность для моего приложения и на основе того, что я прочитал из руководства Apple Developer (мое понимание может быть неправильное), придумали некоторые варианты, но они, похоже, не работают. Вот что я сделал до сих пор.

kSecUseNoAuthenticationUI - YES, код ошибки -25308. Значение kSecUseNoAuthenticationUI - NO, код ошибки -50. Если я не включаю kSecUseNoAuthenticationUI, тогда появляется пользовательский интерфейс аутентификации по умолчанию.Скрытие всплывающего окна TouchId на SecItemUpdate

NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword, 
         (__bridge id)kSecAttrService: @"SampleService", 
         (__bridge id)kSecUseNoAuthenticationUI: @YES 
         }; 

NSDictionary *changes = @{ 
    (__bridge id)kSecValueData: [@"UPDATED_SECRET_PASSWORD_TEXT" dataUsingEncoding:NSUTF8StringEncoding] 
    }; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    OSStatus status = SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)changes); 
    NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_UPDATE_STATUS", nil), [self keychainErrorToString:status]]; 
    [super printResult:self.textView message:msg]; 
});] 

Так что я потерялся на этом этапе. Оцените, можете ли вы дать мне несколько указателей на то, как отключить это всплывающее окно touchId UI на SecItemUpdate. Спасибо

+0

Вы могли выполнить обновление без подсказки TouchID? – SuPotter

+0

Я смог выполнить обновление без подсказки. Я изменил свой secItemAdd на этот '(__bridge id) kSecUseNoAuthenticationUI: @NO, (__bridge id) kSecAttrAccessible: (__ bridge id) kSecAttrAccessibleWhenUnlocked', и это, похоже, исправило его и при обновлении. Первоначально он был установлен в 'kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly ', который вызвал всплывающее приглашение во время обновления. – user1657861

ответ

4

Если вы посмотрите видеозапись WWDC 2014 Session 711, то упоминается о kSecUseNoAuthenticationUI около 31:35.

Вы можете также посмотреть в разделе «SecItem.h»:

@constant kSecUseNoAuthenticationUI Specifies a dictionary key whose value 
     is a CFBooleanRef. If provided with a value of kCFBooleanTrue, the error 
     errSecInteractionNotAllowed will be returned if the item is attempting 
     to authenticate with UI. 

Я не уверен, что вы можете как отключить всплывающие окна и выполнить обновление.

Что я могу понять: установка опции kSecUseNoAuthenticationUI не отображает всплывающее окно. Но если вы пытаетесь получить доступ к элементу, который требует аутентификации, он не сработает, указав вам, что элемент, возвратив errSecInteractionNotAllowed в качестве результата операции

0

В соответствии с примечаниями к выпуску iOS8, это предположительно является случаем и вы должны удалить и повторно добавить свой товар

if (status == errSecDuplicateItem) { // exists 
     status = SecItemDelete((__bridge CFDictionaryRef)attributes); 

     if (status == errSecSuccess) { 
     status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil); 
     } 
}