Xamarin.iOS
Сенсорный ID
Поиск…
параметры
колонка | колонка |
---|---|
клетка | клетка |
замечания
Во-первых, установите, может ли устройство принимать вход Touch ID.
if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out AuthError))
Если это так, мы можем отобразить интерфейс Touch ID с помощью:
context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, myReason, replyHandler);
Есть три части информации, которую мы должны передать в EvaluatePolicy
- сама политика, строка, объясняющая, зачем нужна аутентификация, и обработчик ответа. Обработчик ответа сообщает приложению, что он должен делать в случае успешной или неудачной аутентификации.
Одна из предостережений Local Authentication заключается в том, что он должен запускаться на переднем плане, поэтому обязательно используйте InvokeOnMainThread
для обработчика ответа:
var replyHandler = new LAContextReplyHandler((success, error) =>
{
this.InvokeOnMainThread(() =>
{
if (success)
{
Console.WriteLine("You logged in!");
PerformSegue("AuthenticationSegue", this);
}
else {
//Show fallback mechanism here
}
});
});
Чтобы определить, была ли изменена база данных авторизованных отпечатков пальцев, вы можете проверить непрозрачную структуру (NSData), возвращенную context.EvaluatedPolicyDomainState
. Вашему приложению необходимо будет сохранить и сравнить состояние политики для обнаружения изменений. Одно дело отметить, что Apple заявляет:
Однако характер этих изменений не может быть определен по этим данным.
if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out AuthError))
{
var policyState = context.EvaluatedPolicyDomainState;
var replyHandler = new LAContextReplyHandler((success, error) =>
{
this.InvokeOnMainThread(() =>
{
if (success)
{
Console.WriteLine("You logged in!");
PerformSegue("AuthenticationSegue", this);
}
else {
//Show fallback mechanism here
}
});
});
context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, myReason, replyHandler);
};
Добавить Touch ID в ваше приложение
Во-первых, установите, может ли устройство принимать вход Touch ID.
if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out AuthError))
Если это так, мы можем отобразить интерфейс Touch ID с помощью:
context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, myReason, replyHandler);
Есть три части информации, которую мы должны передать в EvaluatePolicy
- сама политика, строка, объясняющая, зачем нужна аутентификация, и обработчик ответа. Обработчик ответа сообщает приложению, что он должен делать в случае успешной или неудачной аутентификации.
Одна из предостережений Local Authentication заключается в том, что он должен запускаться на переднем плане, поэтому обязательно используйте InvokeOnMainThread
для обработчика ответа:
var replyHandler = new LAContextReplyHandler((success, error) =>
{
this.InvokeOnMainThread(() =>
{
if (success)
{
Console.WriteLine("You logged in!");
PerformSegue("AuthenticationSegue", this);
}
else {
//Show fallback mechanism here
}
});
});
Чтобы определить, была ли изменена база данных авторизованных отпечатков пальцев, вы можете проверить непрозрачную структуру (NSData), возвращенную context.EvaluatedPolicyDomainState
. Вашему приложению необходимо будет сохранить и сравнить состояние политики для обнаружения изменений. Одно дело отметить, что Apple заявляет:
Однако характер этих изменений не может быть определен по этим данным.
if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out AuthError))
{
var policyState = context.EvaluatedPolicyDomainState;
var replyHandler = new LAContextReplyHandler((success, error) =>
{
this.InvokeOnMainThread(() =>
{
if (success)
{
Console.WriteLine("You logged in!");
PerformSegue("AuthenticationSegue", this);
}
else {
//Show fallback mechanism here
}
});
});
context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, myReason, replyHandler);
};
Пример кнопки
partial void AuthenticateMe(UIButton sender)
{
var context = new LAContext();
//Describes an authentication context
//that allows apps to request user authentication using Touch ID.
NSError AuthError;
//create the reference for error should it occur during the authentication.
var myReason = new NSString("To add a new chore");
//this is the string displayed at the window for touch id
if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out AuthError))
// check if the device have touchId capabilities.
{
var replyHandler = new LAContextReplyHandler((success, error) =>
{
this.InvokeOnMainThread(() =>
{
if (success)
{
Console.WriteLine("You logged in!");
PerformSegue("AuthenticationSegue", this);
}
else {
//Show fallback mechanism here
}
});
});
context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, myReason, replyHandler);//send touch id request
};
}
Использование брелка
Рабочий источник - https://github.com/benhysell/V.TouchIdExample
Длинное описание формы - http://benjaminhysell.com/archive/2014/11/authentication-in-xamarin-ios-with-touch-id-or-passcode/
//Simple View with a switch to enable / disable Touch ID and
//a button to invoke authentication
/// <summary>
/// Enable/Disable Touch ID
/// </summary>
/// <param name="sender">Sender.</param>
partial void TouchIdEnableDisable(UISwitch sender)
{
if (sender.On)
{
//enable Touch ID
//set our record
//note what you fill in here doesn't matter, just needs to be
//consistent across all uses of the record
var secRecord = new SecRecord(SecKind.GenericPassword)
{
Label = "Keychain Item",
Description = "fake item for keychain access",
Account = "Account",
Service = "com.yourcompany.touchIdExample",
Comment = "Your comment here",
ValueData = NSData.FromString("my-secret-password"),
Generic = NSData.FromString("foo")
};
secRecord.AccessControl = new SecAccessControl(SecAccessible.WhenPasscodeSetThisDeviceOnly, SecAccessControlCreateFlags.UserPresence);
SecKeyChain.Add(secRecord);
authenticateButton.Enabled = true;
}
else
{
//disable Touch ID
var record = new SecRecord(SecKind.GenericPassword)
{
Service = "com.yourcompany.touchIdExample",
UseOperationPrompt = "Authenticate to Remove Touch ID / Passcode from Test App"
};
SecStatusCode result;
//query one last time to ensure they can remove it
SecKeyChain.QueryAsRecord(record, out result);
if (SecStatusCode.Success == result || SecStatusCode.ItemNotFound == result)
{
//remove the record
SecKeyChain.Remove(record);
authenticateButton.Enabled = false;
}
else
{
//could not authenticate, leave switch on
sender.On = true;
}
}
}
/// <summary>
/// Show Touch ID to user and evaluate authentication
/// </summary>
/// <param name="sender">Sender.</param>
partial void AuthenticateUser(UIButton sender)
{
var rec = new SecRecord(SecKind.GenericPassword)
{
Service = "com.yourcompany.touchIdExample",
UseOperationPrompt = "Authenticate to access Test App"
};
SecStatusCode res;
SecKeyChain.QueryAsRecord(rec, out res);
if (SecStatusCode.Success == res || SecStatusCode.ItemNotFound == res)
{
//Success!!
//add your code here to continue into your application
AuthenticatedLabel.Hidden = false;
}
else
{
//Failure
AuthenticatedLabel.Hidden = true;
}
}