Ich entwickle iOS Apps jetzt schon ziemlich lange. Aber am Ende war ich nie mit dem Architekturdesign für meine Netzwerkschicht zufrieden. Vor allem, wenn es darum geht, eine API zu verbinden.
Es gibt ein mögliches Duplikat hier, aber ich denke, dass meine Frage mehr spezifisch ist, als Sie sehen werden.
Die besten architektonischen Ansätze für den Aufbau von iOS-Netzwerkanwendungen ( REST-Clients)
Ich suche keine Antworten wie "AFNetworking / Alamofire verwenden". Diese Frage ist unabhängig davon, welches Framework von Drittanbietern verwendet wird.
Ich meine, oft haben wir das Szenario:
"Entwickeln Sie eine App X, die API Y"
verwendet
Und dies beinhaltet hauptsächlich die gleichen Schritte - jedes Mal.
Ein Problem mit 3)
In Obj-C habe ich NSProxy
zum Abfangen jedes API-Aufrufs vor dem Senden verwendet, den Benutzer erneut authentifiziert, wenn das Token abgelaufen ist, und die tatsächliche Anforderung abgefeuert.
In Swift hatten wir NSOperationQueue
, wo wir einen Auth-Aufruf in die Warteschlange stellten, wenn wir eine 401 erhielten und die eigentliche Anfrage nach erfolgreicher Aktualisierung in die Warteschlange stellten. Aber das beschränkte uns auf die Verwendung eines Singleton (was mir nicht sehr gefällt) und wir mussten auch die Anzahl gleichzeitiger Anfragen auf 1 begrenzen.
Ich mag eher den zweiten Ansatz - aber gibt es eine bessere Lösung?
Zu 4)
Wie gehen Sie mit http-Statuscodes um? Verwenden Sie für jeden Fehler viele verschiedene Klassen? Zentralisieren Sie die allgemeine Fehlerbehandlung in einer Klasse? Behandeln Sie sie alle auf der gleichen Ebene oder fangen Sie früher Serverfehler auf? (Vielleicht in Ihrem API-Wrapper von einer Drittanbieter-Lib)
Wie wollen Entwickler diese Probleme lösen? Hast du ein "bestes" Design gefunden? Wie testen Sie Ihre APIs? Vor allem, wie machst du das in Swift (ohne echte Spottmöglichkeit?).
Natürlich: Jeder Anwendungsfall, jede App, jedes Szenario ist anders - es gibt keine "Eine Lösung passt für alle". Aber ich denke, diese allgemeinen Probleme treten so oft wieder auf, und ich bin versucht zu sagen: "Ja, für diese Fälle könnte es eine und mehrere Lösungen geben, die Sie jedes Mal wiederverwenden können."
Ich freue mich auf interessante Antworten!
Prost Orlando
Aber das beschränkte uns auf die Verwendung eines Singleton (was mir nicht sehr gefällt) und wir mussten auch die Anzahl gleichzeitiger Anfragen auf 1 begrenzen. Ich mag eher den zweiten Ansatz - aber gibt es eine bessere Lösung?
Ich verwende ein paar Ebenen für die Authentifizierung mit einer API.
Dieser Manager ist für alle Authentifizierungsfunktionen verantwortlich. Sie können über die Authentifizierung nachdenken, das Passwort zurücksetzen, die Funktionen für den Verifizierungscode erneut senden und so weiter.
%Vor%Um ein Token anzufordern, benötigen wir eine neue Ebene namens TokenManager, die alle Dinge verwaltet, die sich auf ein Token .
Um ein Token anzufordern, benötigen wir eine dritte Schicht namens TokenService, die alle HTTP-Aufrufe behandelt. Ich verwende EVReflection und Promises für meine API-Aufrufe.
Ich verwende einen Autorisierungsdienst für das Problem, das Sie hier beschreiben. Diese Ebene ist verantwortlich für das Abfangen von Serverfehlern wie 401 markiert sind (oder welchen Code auch immer Sie verwenden abfangen wollen) und beheben Sie diese, bevor Sie die Antwort an den Benutzer zurücksenden. Bei diesem Ansatz wird alles von dieser Ebene gehandhabt und Sie müssen sich nicht mehr um ein ungültiges Token kümmern.
%Vor%In Obj-C habe ich NSProxy verwendet, um jeden API-Aufruf vor dem Senden abzufangen, hat den Benutzer erneut authentifiziert, wenn das Token abgelaufen ist, und die aktuelle Anforderung abgefeuert. In Swift hatten wir eine NSOperationQueue, in der wir einen Auth-Aufruf in die Warteschlange stellten, wenn wir eine 401 erhielten und die tatsächliche Anfrage nach erfolgreicher Aktualisierung in die Warteschlange stellten. Aber das beschränkte uns auf die Verwendung eines Singleton (was ich nicht sehr mag) und wir mussten auch die Anzahl gleichzeitiger Anfragen auf 1 begrenzen. Ich mag den zweiten Ansatz eher - aber gibt es eine bessere Lösung?
%Vor%Der letzte Teil ist der Netzwerk-Service . In dieser Service-Ebene werden wir alle Interaktoren-ähnlichen Code machen. Alle Geschäftslogik wird hier enden, alles in Bezug auf Vernetzung. Wenn Sie diesen Dienst kurz überprüfen, werden Sie feststellen, dass hier keine UI-Logik vorhanden ist, und das aus gutem Grund.
Eine Beispielimplementierung dieser Architektur wäre eine Authentifizierungs-HTTP-Anfrage, um sich bei einem Benutzer anzumelden. Ich zeige Ihnen, wie dies mit der oben beschriebenen Architektur gemacht wird.
%Vor%Die Handhabung von Fehlern ist immer eine schmutzige Aufgabe. Jeder Entwickler hat seinen eigenen Weg dies zu tun. Im Web gibt es viele Artikel über Fehlerbehandlung in zum Beispiel schnell. Das Anzeigen meiner Fehlerbehandlung wird nicht viel helfen, da es nur meine persönliche Art ist, es zu tun, es ist auch eine Menge Code in dieser Antwort zu posten, also überspringe ich das lieber.
Wie auch immer ...
Ich hoffe, dass ich Ihnen mit diesem Ansatz wieder auf den richtigen Weg gebracht habe. Wenn es Fragen bezüglich dieser Architektur gibt, werde ich mehr als glücklich sein, Ihnen dabei zu helfen. Meiner Meinung nach gibt es keine perfekte Architektur und keine Architektur, die sich auf alle Projekte anwenden lässt.
Es ist eine Frage der Präferenz, der Projektanforderungen und des Fachwissens in Ihrem Team.
Viel Glück und bitte zögern Sie nicht, mich zu kontaktieren, wenn es ein Problem gibt!
Tags und Links ios rest architecture swift networking