Hi zusammen,
nach einer längeren Zwangspause, Dank der Bekanntschaft meiner Hand mit einer Glasscheibe, bin ich jetzt wieder fleißig am testen und lernen und dabei auf ein Problem gestoßen, bei dem ich hoffe, dass Ihr einen Tipp für mich parat habt.
Diese Schritte habe ich bereits abgehakt:
1. PHP & MySQL Rest-API auf dem Server entwickelt - LÄUFT
2. Registrierung und Login mit access token und refresh token innerhalb der IOS-App - LÄUFT
3. Andere Daten an Rest-API senden inklusive access token - LÄUFT
4. Andere Daten von der Rest-API lesen inklusive access token - LÄUFT
5. Access token aktualisieren, wenn abgelaufen, per eigener Funktion refreshToken() - LÄUFT
6. Punkt 5. innerhalb von 3. und 4. durchführen und anschließend den Rest-API-Aufruf mit neuem access token erneut abfeuern - NOPE
Ich komme nicht weiter und es ist wie so oft zum Mäusemelken.
Hier ein Beispiel meines Rest-API-Aufrufs:
Alles anzeigen
Was ich jetzt bereits versucht habe:
1. Die Funktion refreshToken() in der Appdelegate per Timer alle 20 Minuten aufrufen (der access token läuft nach 20 Minuten ab) - Resultat wenn man die App schließt oder sie in Hintergrund kommt, bleibt der Timer stehen und somit werden die 20 Minuten überschitten. Auch mit einer zusätzlichen Abspeicherung des Startzeitpunkts und der Wiederaufnahme des Timers nicht richtig realisierbar. Probiert mit alle 5 Sekunden und sogar alle 2 aber bei vielen Nutzern wird dann irgendwann die Datenbank wohl wegfliegen.
2. Kompletter Umbau der Rest-API-Aufrufe mit Alamofire, um "RequestAdapter" und "RequestRetrier" zu verwenden. Bin ich anscheint zu blöd zu. Nach vielen Stunden hab Ichs aufgegeben. Ich bekam immer nur einen ErrorCode 999 und einen Verbindungsfehler. Recherche im Netz hat mir gesagt, dass ich die Verbindung global verfügbar machen muss, da sie wohl zu schnell durchläuft. Probiert - gescheitert.
3. bei jedem ViewController und TableViewController in der "viewWillAppear" die Funktion refreshToken() aufrufen. Klappt aber das wäre Glücksache. Sollte das Internet mal haken, oder der Server, dann wäre der neue access token nicht rechtzeitig da.
4. refreshToken() vor jedem Rest-API-Aufruf starten. Also wenn z.B. der Button "Daten speichern" geklickt wird erst refreshToken() starten und dann den eigentlichen Rest-API-Aufruf. Könnte gehen nur weiß ich nicht, wie ich mit dem eigentlichen Rest-API-Aufruf warte, bis refreshToken() durch ist??
5. unter "case 401" (in dem kleinen Code oben) die Funktion refreshToken() aufrufen. Geht und ein neuer Token ist da, aber wie starte ich jetzt den eigentliche Rest-API-Aufruf erneut, ohne die ursprünglichen Parameter immer an refreshToken() übergeben zu müssen?
FAZIT
Ich denke 5. ist der richtige Weg, aber ich müsste das irgendwie so lösen, dass ich nicht an refreshToken() alle ursprünglichen Parameter übergeben müsste, da innerhalb der App, jeder Rest-API-Aufruf eigene Parameter hat / benutzt / benötigt. Das würde am Ende ein Chaos geben.
Irgendwie so:
1. Aufruf saveDataToRestAPI(parameter1:123, parameter2: 456, parameter3: 789)
2. Antwort 401 (token abgelaufen) > Aufruf refreshToken()
3. refreshToken() fertig > zurück zu 1.
Aber wie meine Freunde? Wie kann ich das umsetzen?
Ich freue mich auf eure Ideen & Tipps und wünsche allen einen schönen Sonntag!
LG
nach einer längeren Zwangspause, Dank der Bekanntschaft meiner Hand mit einer Glasscheibe, bin ich jetzt wieder fleißig am testen und lernen und dabei auf ein Problem gestoßen, bei dem ich hoffe, dass Ihr einen Tipp für mich parat habt.
Diese Schritte habe ich bereits abgehakt:
1. PHP & MySQL Rest-API auf dem Server entwickelt - LÄUFT
2. Registrierung und Login mit access token und refresh token innerhalb der IOS-App - LÄUFT
3. Andere Daten an Rest-API senden inklusive access token - LÄUFT
4. Andere Daten von der Rest-API lesen inklusive access token - LÄUFT
5. Access token aktualisieren, wenn abgelaufen, per eigener Funktion refreshToken() - LÄUFT
6. Punkt 5. innerhalb von 3. und 4. durchführen und anschließend den Rest-API-Aufruf mit neuem access token erneut abfeuern - NOPE
Ich komme nicht weiter und es ist wie so oft zum Mäusemelken.
Hier ein Beispiel meines Rest-API-Aufrufs:
Quellcode
- let parameters = ["taskname": "\(taskname)"]
- let accessToken = "123456"
- let url = URL(string: restapiURL)!
- let session = URLSession.shared
- var request = URLRequest(url: url)
- request.httpMethod = "POST"
- do {
- request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
- } catch let error {
- print(error.localizedDescription)
- }
- request.addValue(accessToken, forHTTPHeaderField: "Authorization")
- request.addValue("application/json", forHTTPHeaderField: "Content-Type")
- request.addValue("application/json", forHTTPHeaderField: "Accept")
- let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
- guard error == nil else {
- return
- }
- guard let data = data else {
- return
- }
- do {
- let json = try JSON(data: data)
- if let status = json["statusCode"].int {
- switch status {
- case 201:
- DispatchQueue.main.async {
- print("ALLES BESTENS")
- }
- case 401:
- DispatchQueue.main.async {
- print("OH MIST - DER TOKEN IST WIEDER ABGELAUFEN")
- }
- default: break
- }
- }
- } catch let error {
- print(error.localizedDescription)
- }
- })
- task.resume()
1. Die Funktion refreshToken() in der Appdelegate per Timer alle 20 Minuten aufrufen (der access token läuft nach 20 Minuten ab) - Resultat wenn man die App schließt oder sie in Hintergrund kommt, bleibt der Timer stehen und somit werden die 20 Minuten überschitten. Auch mit einer zusätzlichen Abspeicherung des Startzeitpunkts und der Wiederaufnahme des Timers nicht richtig realisierbar. Probiert mit alle 5 Sekunden und sogar alle 2 aber bei vielen Nutzern wird dann irgendwann die Datenbank wohl wegfliegen.
2. Kompletter Umbau der Rest-API-Aufrufe mit Alamofire, um "RequestAdapter" und "RequestRetrier" zu verwenden. Bin ich anscheint zu blöd zu. Nach vielen Stunden hab Ichs aufgegeben. Ich bekam immer nur einen ErrorCode 999 und einen Verbindungsfehler. Recherche im Netz hat mir gesagt, dass ich die Verbindung global verfügbar machen muss, da sie wohl zu schnell durchläuft. Probiert - gescheitert.
3. bei jedem ViewController und TableViewController in der "viewWillAppear" die Funktion refreshToken() aufrufen. Klappt aber das wäre Glücksache. Sollte das Internet mal haken, oder der Server, dann wäre der neue access token nicht rechtzeitig da.
4. refreshToken() vor jedem Rest-API-Aufruf starten. Also wenn z.B. der Button "Daten speichern" geklickt wird erst refreshToken() starten und dann den eigentlichen Rest-API-Aufruf. Könnte gehen nur weiß ich nicht, wie ich mit dem eigentlichen Rest-API-Aufruf warte, bis refreshToken() durch ist??
5. unter "case 401" (in dem kleinen Code oben) die Funktion refreshToken() aufrufen. Geht und ein neuer Token ist da, aber wie starte ich jetzt den eigentliche Rest-API-Aufruf erneut, ohne die ursprünglichen Parameter immer an refreshToken() übergeben zu müssen?
FAZIT
Ich denke 5. ist der richtige Weg, aber ich müsste das irgendwie so lösen, dass ich nicht an refreshToken() alle ursprünglichen Parameter übergeben müsste, da innerhalb der App, jeder Rest-API-Aufruf eigene Parameter hat / benutzt / benötigt. Das würde am Ende ein Chaos geben.
Irgendwie so:
1. Aufruf saveDataToRestAPI(parameter1:123, parameter2: 456, parameter3: 789)
2. Antwort 401 (token abgelaufen) > Aufruf refreshToken()
3. refreshToken() fertig > zurück zu 1.
Aber wie meine Freunde? Wie kann ich das umsetzen?
Ich freue mich auf eure Ideen & Tipps und wünsche allen einen schönen Sonntag!
LG
Neu in der IOS-App-Entwicklungswelt - Spannend, ab und an nervenaufreibend, aber am Ende einfach faszinierend. Seid bitte nicht zu streng wenn ich Fragen einmal doppelt stelle, ich lerne noch
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von CodeNerd ()