Viele Apps verfügen über eine Funktion, die Sie nach einer bestimmten Zeit der Inaktivität automatisch abmeldet. Einige dieser Apps melden Sie jedoch aufgrund von API-Inaktivität ab, während andere einen Abmelde-Timer implementieren, indem sie die UIView-Steuerelemente überschreiben. In diesem Artikel werden wir einen besseren Weg erkunden, dieses Verhalten mithilfe der hitTest-Methode zu erreichen. Und einige Apps melden Sie aufgrund der Zeitdifferenz zwischen der letzten Anmeldung/dem letzten API-Aufruf und der aktuellen Zeit ab. Das Problem beim letzten Ansatz besteht darin, dass Sie Ihre Sitzung ständig am Leben halten können, indem Sie Ihre Zeit auf einem Gerät manuell auf den Anmeldezeitpunkt einstellen.
Das Problem beim ersten Ansatz besteht darin, dass einige Benutzer möglicherweise abgemeldet werden, selbst wenn sie nur durch Inhalte scrollen und keine Anfragen an das Backend stellen. Stellen Sie sich einen Benutzer vor, der vor dem Öffnen die Allgemeinen Geschäftsbedingungen eines bestimmten Bankprodukts liest und abgemeldet wird. Das wollen wir auf jeden Fall vermeiden.
Das Problem beim zweiten Ansatz besteht darin, dass es schwierig sein kann, die Funktion zum Abmelden bei Inaktivität in einer vorhandenen Codebasis zu implementieren, insbesondere wenn die App über eine große Codebasis mit benutzerdefinierten Ansichten verfügt.
Hier kann die hitTest-Methode sehr hilfreich sein.
Wir können einen Hack mit der hitTest-Methode verwenden, um die aufgeführten Probleme zu lösen.
Nehmen wir an, wir haben bereits eine implementierte Version einer Klasse, die für die Verfolgung der Zeit einer Benutzeraktivität verantwortlich ist.
Wir werden es mit der folgenden API ausdrücken:
protocol IUserActivity { func resetInactiveTime() }
extension UIWindow { open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { userActivity.resetInactiveTime() return super.hitTest(point, with: event) } }
Und das ist es! Jetzt wird diese Methode bei jedem interaktiven Ereignis ausgelöst, das der Benutzer auf einem Bildschirm ausführt, z. B. Tippen, Scrollen und andere Gestenaktivitäten.
Sie könnten auch eine Unterklasse eines UIWindow deklarieren und dort eine hitTest-Methode überschreiben.
Berührungsereignisse in iOS entstehen typischerweise durch Benutzerinteraktionen mit dem Touchscreen des Geräts.
Wenn der Benutzer den Bildschirm berührt, erkennt die Hardware die Berührung und generiert einen Strom roher Berührungsdaten, der Informationen wie Ort, Druck und Dauer der Berührung enthält.
Diese rohen Berührungsdaten werden dann vom Betriebssystem verarbeitet und in Berührungsereignisse auf hoher Ebene umgewandelt, die von UIKit verarbeitet werden können. Das Betriebssystem bestimmt anhand der Berührungsposition und der Ansichtshierarchie, welchem UIWindow-Objekt das Berührungsereignis entspricht, und sendet das Berührungsereignis dann zur Verarbeitung an das UIResponder-Objekt dieses Objekts.
Wenn ein Berührungsereignis auftritt, verwendet das iOS-Betriebssystem einen Treffertestalgorithmus, um zu bestimmen, welchem UIView- oder UIWindow-Objekt das Berührungsereignis entspricht.
Der Treffertestalgorithmus beginnt beim UIWindow-Objekt der obersten Ebene und überprüft rekursiv jede Unteransicht in der Ansichtshierarchie, bis er die tiefste Ansicht findet, die den Berührungspunkt enthält. Dazu wird überprüft, ob sich der Berührungspunkt innerhalb des Rahmens jeder Unteransicht befindet.
Der Treffertest verwendet einen Deep-First-Reverse-Pre-Order-Traversal-Algorithmus. Mit anderen Worten: Der Algorithmus besucht zuerst den Wurzelknoten und durchläuft dann seine Teilbäume von höheren zu niedrigeren Indizes.
Diese Art der Durchquerung ermöglicht es, die Anzahl der Durchlaufiterationen zu reduzieren und den Suchvorgang zu stoppen, sobald die erste tiefste Nachkommenansicht gefunden wird, die den Berührungspunkt enthält.
Dies ist möglich, da eine Unteransicht immer vor ihrer Oberansicht gerendert wird und eine Geschwisteransicht immer vor ihren Geschwisteransichten mit einem niedrigeren Index im Subviews-Array gerendert wird. Wenn mehrere überlappende Ansichten einen bestimmten Punkt enthalten, ist die tiefste Ansicht im Teilbaum ganz rechts die vorderste Ansicht (1) .
Wie wir sehen können, beginnt der Traverse-Algorithmus immer mit dem UIWindow-Objekt, unabhängig davon, mit welcher Ansicht oder welchem Steuerelement der Benutzer interagiert.
Und wir können dies definitiv für unsere Zwecke nutzen, indem wir diese Ereignisse einfach in der hitTest-Methode der UIWindow-Klasse abfangen!
Das ist es! Lassen Sie mich in den Kommentaren unten wissen, was Sie denken.