2016-07-15 2 views
1

Я интегрирую TouchID в свое приложение. Я разрешаю пользователю включать и выключать его по соображениям безопасности. Я хочу, чтобы он автоматически отключился, когда пользователь добавляет новый отпечаток. Согласно Apple, evaluatedPolicyDomainStateTouchID - обнаружение новых отпечатков пальцев - Когда оценивается значениеPolicyDomainState?

This property returns a value only when the canEvaluatePolicy(:error:) method succeeds for a biometric policy or the evaluatePolicy(:localizedReason:reply:) method is called and a successful Touch ID authentication is performed. Otherwise, nil is returned.

The returned data is an opaque structure. It can be used to compare with other values returned by this property to determine whether the database of authorized fingerprints has been updated. However, the nature of the change cannot be determined from this data.

Однако, я добавляю новые отпечатки пальцев и evaluatedPolicyDomainState остается неизменным.

Любая идея о том, как я могу убедиться, что обновление evaluatedPolicyDomainState или если есть какой-либо другой способ проверки наличия нового отпечатка пальца?

ответ

8

Так что после битвы в течение нескольких часов я наконец нашел решение.

let context = LAContext() 
    context.canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics, error: nil) 

    if let domainState = context.evaluatedPolicyDomainState 
     where domainState == oldDomainState { 
     // Enrollment state the same 

    } else { 
     // Enrollment state changed 

    } 

Каждый раз, когда вы добавляете или удаляете отпечаток пальца, состояние домена изменяется. Вам необходимо позвонить canEvaluatePolicy за evaluatedPolicyDomainState для обновления.

+0

Привет, Кристиан, У нас также есть это требование в нашем приложении. Можете ли вы рассказать, что я должен назначить для oldDomainState Variable? – RXGangam

+0

Когда вы впервые попросите пользователя установить touchID, вы будете использовать 'context.evaluatePolicy'. Если это удастся, вы получите текущую политику и сохраните ее в oldDomainState. –

+0

Я использовал kSecAccessControlTouchIDCurrentSet. Теперь он работает так, как ожидалось. – RXGangam

0

Ниже приведено решение для преобразования значения данных оцененоPolicyDomainState в строку и сохранить его в брелках. Если есть какое-либо изменение сенсорного идентификатора, вам просто нужно сравнить значение с оценкойPolicyDomainState.

if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) { 
 
    if let domainState = context.evaluatedPolicyDomainState { 
 
     let bData = domainState.base64EncodedData() 
 
     if let decodedString = String(data: bData, encoding: .utf8) { 
 
      print("Decoded Value: \(decodedString)") 
 
     } 
 
    } 
 
}

Примечание: Я не проверял этот код для Id Face, я считаю, что это будет работать для обоих.

Смежные вопросы