Xamarin.iOS
Berührungsidentifikation
Suche…
Parameter
Säule | Säule |
---|---|
Zelle | Zelle |
Bemerkungen
Stellen Sie zunächst fest, ob das Gerät die Touch ID-Eingabe akzeptieren kann.
if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out AuthError))
Wenn dies der Fall ist, können Sie die Touch-ID-Benutzeroberfläche anzeigen, indem Sie Folgendes verwenden:
context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, myReason, replyHandler);
Es gibt drei Informationen, die wir an EvaluatePolicy
- die Richtlinie selbst, eine Zeichenfolge, aus der hervorgeht, warum eine Authentifizierung erforderlich ist, und einen Antworthandler. Der Antworthandler teilt der Anwendung mit, was sie im Falle einer erfolgreichen oder erfolglosen Authentifizierung tun soll.
Eine der Einschränkungen der lokalen Authentifizierung besteht darin, dass sie im Vordergrund ausgeführt werden muss. InvokeOnMainThread
daher sicher, dass Sie InvokeOnMainThread
für den InvokeOnMainThread
:
var replyHandler = new LAContextReplyHandler((success, error) =>
{
this.InvokeOnMainThread(() =>
{
if (success)
{
Console.WriteLine("You logged in!");
PerformSegue("AuthenticationSegue", this);
}
else {
//Show fallback mechanism here
}
});
});
Um festzustellen, ob die Datenbank autorisierter Fingerabdrücke geändert wurde, können Sie die von context.EvaluatedPolicyDomainState
undurchsichtige Struktur (NSData) context.EvaluatedPolicyDomainState
. Ihre App muss den Richtlinienstatus speichern und vergleichen, um Änderungen zu erkennen. Eine Sache, die Apple feststellt:
Die Art der Änderung kann jedoch nicht aus diesen Daten bestimmt werden.
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);
};
Fügen Sie Ihrer App eine Touch-ID hinzu
Stellen Sie zunächst fest, ob das Gerät die Touch ID-Eingabe akzeptieren kann.
if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out AuthError))
Wenn dies der Fall ist, können Sie die Touch-ID-Benutzeroberfläche anzeigen, indem Sie Folgendes verwenden:
context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, myReason, replyHandler);
Es gibt drei Informationen, die wir an EvaluatePolicy
- die Richtlinie selbst, eine Zeichenfolge, aus der hervorgeht, warum eine Authentifizierung erforderlich ist, und einen Antworthandler. Der Antworthandler teilt der Anwendung mit, was sie im Falle einer erfolgreichen oder erfolglosen Authentifizierung tun soll.
Eine der Einschränkungen der lokalen Authentifizierung besteht darin, dass sie im Vordergrund ausgeführt werden muss. InvokeOnMainThread
daher sicher, dass Sie InvokeOnMainThread
für den InvokeOnMainThread
:
var replyHandler = new LAContextReplyHandler((success, error) =>
{
this.InvokeOnMainThread(() =>
{
if (success)
{
Console.WriteLine("You logged in!");
PerformSegue("AuthenticationSegue", this);
}
else {
//Show fallback mechanism here
}
});
});
Um festzustellen, ob die Datenbank autorisierter Fingerabdrücke geändert wurde, können Sie die von context.EvaluatedPolicyDomainState
undurchsichtige Struktur (NSData) context.EvaluatedPolicyDomainState
. Ihre App muss den Richtlinienstatus speichern und vergleichen, um Änderungen zu erkennen. Eine Sache, die Apple feststellt:
Die Art der Änderung kann jedoch nicht aus diesen Daten bestimmt werden.
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);
};
Schaltflächenbeispiel
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
};
}
Schlüsselbund verwenden
Arbeitsquelle - https://github.com/benhysell/V.TouchIdExample
Langformbeschreibung - 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;
}
}