Je suis en train de travailler sur une paix de code qui devrait prendre les mesures suivantes:
- Stocker des données dans le Trousseau d'accès.
- Obtenir les données uniquement si un utilisateur s'authentifie avec Touch ID ou mot de Passe.
J'ai regardé le Trousseau et l'Authentification avec Touch ID présentation et compris les suivantes:
Si vous définissez le paramètre correct lors de l'ajout d'une nouvelle valeur dans le Trousseau, la prochaine fois vous essayez de sortir, le système affiche automatiquement la Touch ID popup.
J'ai écrit du code, et mon hypothèse ne fonctionne pas. C'est ce que j'ai écrit:
//
// 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);
Au début, je pensais que l'émulateur avait quelques problèmes, mais non, j'ai été en mesure de vérifier si le Touch ID est présent ou pas avec le code suivant:
//
// 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");
}
Et j'ai aussi été en mesure par programme afficher le code de Touche popup avec le code suivant:
//
// 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");
}
});
Pour résumer le tout
Touch ID fonctionne, mais l'enregistrement d'une valeur de Keychain avec le drapeau de force Touch ID par le système lui-même ne fonctionne pas - ce qui me manque?
Pommes exemple
L'exemple d'Apple appelé KeychainTouchID: l'Utilisation de Touch ID avec Trousseau et LocalAuthentication montre également incompatible résultat et Touch ID n'est pas appliquée par le système.
Tech spec
- Xcode 8.1
- Swift 3