Wenn Ihre Anwendung über eine Registrierungsfunktion verfügt, die die Möglichkeit oder Notwendigkeit umfasst, einen neuen Benutzernamen und ein neues Kennwort einzugeben, sind Sie höchstwahrscheinlich an der Innovation in
iOS 12 interessiert, die ich skizzieren möchte. Dies ist ein Dienst, der neue Kennwörter für den Benutzer erfindet, diese automatisch in den erforderlichen Feldern ersetzt und sicher im
Schlüsselbund speichert .
Automatisch von den Systemkennwörtern generierte Kennwörter sind am widerstandsfähigsten gegen Auswahl (zufällig generierte Zeichenfolgen - angepasst an benutzerdefinierte Einschränkungen, aber dazu später mehr), entlasten Anwendungsbenutzer von der Notwendigkeit, eine eigene Folge zu erstellen, und sind flexibel auf die Anforderungen einer bestimmten Anwendung konfiguriert. Die Unterstützung für neue Funktionen ist jedoch recht einfach, jedoch nicht ohne Funktionen. Aber das Wichtigste zuerst.
Rechte und Pflichten
Zunächst muss die Anwendung den Wunsch erklären, diese Funktionalität zu nutzen. In der Liste der Funktionen des entsprechenden
Ziels müssen Sie zunächst eine Domäne in der Liste der zugeordneten
Domänen haben . Seltsamerweise muss die Anwendung über eine „zugeordnete Domäne“ verfügen, um die generierten Kennwörter verwenden und im „Schlüsselbund“ des Benutzers speichern zu können (diese beiden Funktionen sind miteinander verbunden, und die Generierung kann nicht getrennt vom Speicher verwendet werden).
Wenn die Anwendung bereits die
Verwendung freigegebener Konten für Ihre Site unterstützt (die sogenannten "freigegebenen Anmeldeinformationen") , liegt dieser Schritt bereits zurück. Möglicherweise liegt es auch bereits dahinter, und wenn die Anwendung
Universal Links oder einen anderen Mechanismus zur Verarbeitung externer
„URLs“ unterstützt .
Nach dem Hinzufügen dieser Kompatibilität hat die Anwendung jedenfalls eine neue
Berechtigung .
Zusätzlich zu dieser allgemeineren Kompatibilität sollte die Anwendung auch über "Capatibility"
(AutoFill Credential Provider) verfügen. Auf diese Weise kann die Anwendung mit Erlaubnis des Benutzers die vom System angebotenen Anmeldungen und Kennwörter verwenden. Durch Hinzufügen dieser Kompatibilität wird die
Berechtigung zum Anbieter von AutoFill-Anmeldeinformationen angezeigt .
Das Hinzufügen dieser und anderer Funktionen steht übrigens nur Mitgliedern des Apple Developer Program zur Verfügung .
Das von der Anwendung verwendete Bereitstellungsprofil muss außerdem die folgenden zwei Funktionen enthalten.
Verwendete Abhängigkeiten
Das Hinzufügen einer geeigneten Kompatibilität führt dazu, dass
das AuthenticationServices- Framework in der Liste der verknüpften Frameworks und Bibliotheken des entsprechenden Ziels angezeigt wird. Dieser Punkt weist einige erwähnenswerte Merkmale auf.
Erstens funktioniert das automatische Hinzufügen eines verwandten Frameworks möglicherweise nicht beim ersten Mal: Wenn ich die Anwendung auf einem realen Gerät von meiner Kopie von
"Xcode" Version 10.1 aus starte, "stürzte" die Anwendung sofort ab, da "AuthenticationServices" fehlen. Das Problem wurde behoben, indem das Framework manuell entfernt und wieder zur Liste der zugehörigen Komponenten hinzugefügt wurde.
Zweitens wird das automatische Hinzufügen eines Frameworks als "Erforderlich" markiert. Wenn Ihre Anwendung die Möglichkeit impliziert, unter den iOS-Versionen unter 12 zu arbeiten, führt dies auch dazu, dass sie in der Startphase unter Betriebssystemen niedrigerer Versionen abstürzt. "AuthenticationServices" sind nur für Systeme der Version 12 verfügbar. Dieses Problem wird gelöst, indem das Framework als
"Optional" markiert wird.
Textfeldunterstützung
Zur Unterstützung der Funktionalität mit Textfeldern wird die Variable
textContentType
Protokolls
UITextInputTraits
. Die
UITextField
Klasse, die höchstwahrscheinlich zur Eingabe des Logins und des Kennworts in der Anwendung verwendet wird, implementiert bereits die Anforderungen des von uns benötigten Protokolls.
textContentType
ist ein Feld vom Typ
UITextContentType
das nur eine Reihe von Konstanten enthält. Was wir im Moment
newPassword
, ist
newPassword
, das zur Eingabe eines neuen Passworts verwendet wird, das gerade erfunden wird (nicht zu verwechseln mit dem
password
das zur Eingabe eines vorhandenen Passworts verwendet wird).
let passwordTextField = UITextField() if #available(iOS 12, *) { passwordTextField.textContentType = .newPassword }
Das Festlegen des Werts von
textContentType
in eine
"API" textContentType
, da diese Konstante wie die allgemeine Funktionalität nur ab "iOS 12" verfügbar ist.
Zusätzlich zum Inhaltstyp muss das Textfeld eine sichere Dateneingabe bieten:
passwordTextField.isSecureTextEntry = true
Obwohl die Anwendung möglicherweise die in unserer Zeit beliebte Funktion zum Anzeigen und Ausblenden des eingegebenen Passworts bietet, wird das generierte Passwort nur angeboten, wenn das Flag zu diesem Zeitpunkt
true
ist.
Ein interessanter Punkt hängt mit dem Inhaltstyp des Textfelds zusammen: Wenn auf dem Bildschirm kein anderes Feld mit dem
username
des Inhaltstyps vorhanden ist, wird das automatisch generierte Kennwort nicht angeboten. Dies liegt daran, dass die Funktionalität nicht nur auf dem angegebenen Typ des Textfeldinhalts basiert, sondern auch auf einer
heuristischen Analyse des Bildschirminhalts .
Es scheint, dass die Kennwortgenerierung die Logik von Bildschirmen „bricht“, für deren Überprüfung ein neues Kennwort zweimal eingegeben werden muss. Zumindest habe ich noch keinen Weg gefunden, diese beiden Funktionen zusammen zu nutzen. Und anscheinend
bin ich nicht der einzige .
Es ist erwähnenswert, dass, wenn das Login semantisch eine E-Mail-Adresse ist (und ich daher wirklich den geeigneten Tastaturtyp haben möchte), die
Tastaturtypen und der Inhalt kombiniert werden können:
let userNameTextField = UITextField() userNameTextField.keyboardType = .emailAddress userNameTextField.textContentType = .username
Passwortanforderungen
Oft müssen Benutzerkennwörter bestimmten Regeln folgen (eine bestimmte Länge haben, bestimmte Zeichen enthalten usw.). Diese Regeln können angegeben werden, damit das System sie beim Generieren von Kennwörtern berücksichtigt. Dies erfolgt über die Eigenschaft
passwordRules
des
UITextInputTraits
Protokolls. Zum Beispiel:
if #available(iOS 12, *) { passwordTextField.passwordRules = UITextInputPasswordRules(descriptor: "required: upper; required: lower; required: digit; minlength: 8;") }
Die Eigenschaft ist auch nur ab "iOS 12" verfügbar.
Der Typ der Eigenschaft ist
UITextInputPasswordRules
. Initialisierung - unter Verwendung einer Deskriptorzeichenfolge. Das Handle hat eine einfache Syntax und besteht aus einfachen Kennwortanforderungen, die mit einem Semikolon aufgelistet sind. Jede Anforderung ist ein Schlüssel-Wert-Paar, das durch einen Doppelpunkt getrennt ist. Der Schlüssel ist der Regeltyp (z. B. "muss unbedingt enthalten sein" -
required
), und der Wert ist das Element, das dieser Regel folgen muss (z. B. Ziffern -
digit
).
Im obigen Beispiel bedeutet der Deskriptor:
required: upper
- das Vorhandensein von mindestens einem Großbuchstaben ist erforderlich;required: lower
- Gleiches gilt für mindestens einen Kleinbuchstaben.required: digit
- Gleiches gilt für mindestens eine Kleinbuchstabe.minlength: 8
- Die Mindestlänge beträgt acht Zeichen.
Eine detaillierte Auflistung möglicher Schlüssel und Werte finden Sie in einem
guten Artikel, der auf der NSHipster-Website veröffentlicht wurde .
Und
Apple bietet einen recht praktischen
Assistenten zum Zusammenstellen von Deskriptoren , der nicht nur eine bequeme Möglichkeit zum Erstellen dieser
Deskriptoren bietet, sondern auch eine Überprüfung kompilierter Deskriptoren in Form einer unbegrenzten Anzahl generierter Beispiele. Dort können Sie sehen, welche Regeln standardmäßig angewendet werden.
Validierung
Nur für den Fall, dass klargestellt werden sollte, dass der Mechanismus zur Kennworterzeugung keine Validierung der vom Benutzer eingegebenen Daten bietet - Sie müssen sich selbst darum kümmern. Was natürlich ziemlich logisch ist, weil Der Anwendungsbenutzer kann das vorgeschlagene automatisch generierte Kennwort ablehnen oder sogar die Generierung von Kennwörtern und die automatische Vervollständigung von Feldern verbieten.
Interface Builder
Was bemerkenswert und im Geiste unserer Zeit ist, können alle aufgelisteten Textfeldeinstellungen im
"Interface Builder" bis zur "Passwortregel" festgelegt werden:

Funktionsprüfung
Die Funktionalität ist nicht kompliziert, weist jedoch eine Reihe von Nuancen auf: Wenn Sie sie konfigurieren, können Sie leicht etwas vergessen. In diesem Fall wird in den "Debug" -Baugruppen, wenn das entsprechende Textfeld aktiviert ist, der Grund in der Konsole angezeigt, für die die Funktionalität derzeit nicht funktioniert.
Zum Beispiel:
[AutoFill] Cannot show Automatic Strong Passwords for app bundleID: <...> due to error: Cannot save passwords for this app. Make sure you have set up Associated Domains for your app and AutoFill Passwords is enabled in Settings
Beachten Sie außerdem immer, dass diese Art von Funktionalität zu den Aktionen gehört, für die eine Benutzerberechtigung erforderlich ist. In diesem Fall sind zwei erforderlich:
1. iCloud-Schlüsselbund;
2. AutoFill.
Fazit
Dies scheint alles zu sein, worauf bei der Unterstützung neuer Funktionen geachtet werden sollte. Wenn jemand, der gerade daran arbeitet, auf andere interessante Funktionen gestoßen ist, werde ich dies einmal kommentieren und den Artikel gegebenenfalls ergänzen.
Die Funktion ist sehr interessant und kann bei korrekter Verwendung die
Benutzererfahrung Ihrer Anwendung verbessern!