Я работаю над кодом, который должен сделать следующее:
- Сохраните некоторые данные в цепочке ключей.
- Получить данные только в том случае, если пользователь аутентифицируется с помощью Touch ID или Pass Code.
Я просмотрел презентацию Keychain and Authentication with Touch ID и понял следующее:
Если вы установите правильный параметр при добавлении нового значения в Keychain, в следующий раз вы попытаетесь выяснить это, система автоматически покажет Всплывающее окно с сенсорным идентификатором.
Я написал код, и мое предположение не работает. Вот что я написал:
//
// Secret value to store
//
let valueData = "The Top Secret Message V1".data(using: .utf8)!;
//
// Create the Access Controll object telling how the new value
// should be stored. Force Touch ID by the system on Read.
//
let sacObject =
SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
.userPresence,
nil);
//
// Create the Key Value array, that holds the query to store
// our data
//
let insert_query: NSDictionary = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccessControl: sacObject!,
kSecValueData: valueData,
kSecUseAuthenticationUI: kSecUseAuthenticationUIAllow,
// This two valuse ideifieis the entry, together they become the
// primary key in the Database
kSecAttrService: "app_name",
kSecAttrAccount: "first_name"
];
//
// Execute the query to add our data to Keychain
//
let resultCode = SecItemAdd(insert_query as CFDictionary, nil);
Сначала я подумал, что у эмулятора есть некоторые проблемы, но нет, я смог проверить, присутствует ли Touch ID или нет со следующим кодом:
//
// Check if the device the code is running on is capapble of
// finger printing.
//
let dose_it_can = LAContext()
.canEvaluatePolicy(
.deviceOwnerAuthenticationWithBiometrics, error: nil);
if(dose_it_can)
{
print("Yes it can");
}
else
{
print("No it can't");
}
И я также смог программно показать всплывающее окно Touch ID со следующим кодом:
//
// Show the Touch ID dialog to check if we can get a print from
// the user
//
LAContext().evaluatePolicy(
LAPolicy.deviceOwnerAuthenticationWithBiometrics,
localizedReason: "Such important reason ;)",
reply: {
(status: Bool, evaluationError: Error?) -> Void in
if(status)
{
print("OK");
}
else
{
print("Not OK");
}
});
Чтобы суммировать все это
Touch ID работает, но сохранение значения в Keychain с флагом, чтобы заставить Touch ID самой системой не работает - что мне не хватает?
Пример яблок
Пример, который Apple предоставляет под названием KeychainTouchID: использование Touch ID с Keychain и LocalAuthentication также показывает непоследовательный результат, а Touch ID не применяется система.
Технические характеристики
- Xcode 8.1
- Swift 3