Xcode und Localhost Request JSON?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Xcode und Localhost Request JSON?

    Hallo Leute, ich benötige eure Hilfe. :) Xcode und allgemein Programmieren ist mir relativ neu (ca. seit 3 Monaten)

    Zunächst kurz zum Problem bzw. was ich wissen möchte.

    Kurzfassung:
    Ich arbeite an einem Projekt, wo anhang eines bestimmten QR Codes ein 3D Modell geladen werden soll.
    Das Modell wird dann zb. Platziert, was auch immer.

    Ich nutze auf meinem macbook einen Lokalen Server mit Docker (HTTP Protokoll).
    Jetzt möchte ich das beim QR Scannen eine WebRequest an den Server geschickt wird. (dafür gibts eine API)
    Als Antwort sollte ich eine JSON bekommen, mit den Daten die auf dem Server zu diesem QR Code (GUID) hinterlegt sind.
    Allerdings muss man sich vorher auf dem Server einloggen, dafür schicke ich beim App Start ein POST-Request mit einem JSON, das Username und Passwort enthält.
    Jetzt sollte ich eine JSON mit apitoken wiederbekommen...
    Stattdessen sagt die Xcode Console folgendes:
    App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
    The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

    Darauf hin habe ich die info.plist angepasst:
    <key>NSAppTransportSecurity</key> <dict><key>NSAllowsArbitraryLoads</key><true/><key>NSExceptionDomains</key><dict><key>example.com</key><dict><key>NSExceptionAllowsInsecureHTTPLoads</key><true/><key>NSIncludesSubdomains</key><true/></dict></dict></dict>
    Die Console meckert nicht mehr, aber es kommt auch nichts von Server(Lokalserver) wieder.

    Hat jemand eine Idee, vllt habt ihr schon mit sowas zu tun gehabt.
    Bin für Alle Vorschläge offen


    Danke

    Gruß :thumbsup:
  • Ok, dann ist der Server also erreichbar. Wie kommunizierst Du mit dem Server, per URLSession?

    Poste doch mal den Source Code. Dann kann man evtl. etwas mehr sagen.

    Bei Verwendung von z.B. dataTask(with:completionHandler:) erhältst Du ja ein URLResponse und ein Error Objekt im completionHandler. Da könnten evtl. weitere Informationen enthalten sein, ob/warum der Request nicht funktioniert hat.
  • MCDan schrieb:

    Ok, dann ist der Server also erreichbar. Wie kommunizierst Du mit dem Server, per URLSession?

    Poste doch mal den Source Code. Dann kann man evtl. etwas mehr sagen.

    Bei Verwendung von z.B. dataTask(with:completionHandler:) erhältst Du ja ein URLResponse und ein Error Objekt im completionHandler. Da könnten evtl. weitere Informationen enthalten sein, ob/warum der Request nicht funktioniert hat.
    Morgen MCDan,

    also wenn ich zb. meinen Lokal Server über Advanced REST client ( Free Tool für Chrome) anspreche:
    Method:Post
    Request URL:localhost:5000/api/login
    Body: {"email":"test@test.de","password":"Test-01."}
    Dann kriege ich als Antwort den apitoken den ich brauche:

    Quellcode

    1. {
    2. "apitoken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI3YzE0ODUzNi1hZDc1LTQyODgtODRiZC01NzgzMTlmODFlNmYiLCJqdGkiOiJmMmQwZDk2Ny02MTM4LTQ0YTktODg2NC0wODNlMDc1YmUwZWEiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6InRlc3RAdGVzdC5kZSIsImV4cCI6MTUzNjczODU5OSwiaXNzIjoiUkVXRUlWIiwiYXVkIjoiUkVXRUlWLUFQSSJ9.AELWQ3xcVwT8LLVU7xMulfLo87k28tBgNypf1me9Lv4",
    3. "userid": "7c148536-ad75-4288-84bd-578319f81e6f"
    4. }

    Also soweit so gut.

    Das ganze mache ich dann in Xcode folgendermaßen.
    Den Test User habe ich vorher auf dem Lokal Server angelegt.
    Die Methode innerhalb der Klasse:

    Quellcode

    1. // Autorization
    2. func startAutorization() {
    3. // prepare json data
    4. let json: [String: Any] = ["email": "test@test.de",
    5. "password": "Test-01."]
    6. let jsonData = try? JSONSerialization.data(withJSONObject: json)
    7. // Create POST Request
    8. let url = URL(string: "http://localhost:5000/api/login")!
    9. var request = URLRequest(url: url)
    10. request.httpMethod = "POST"
    11. // insert json data to the request
    12. request.httpBody = jsonData
    13. let task = URLSession.shared.dataTask(with: request) { data, response, error in
    14. guard let data = data, error == nil else {
    15. print(error?.localizedDescription ?? "Keine Daten")
    16. return
    17. }
    18. let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
    19. if let responseJSON = responseJSON as? [String: Any] {
    20. print(responseJSON)
    21. }
    22. }
    23. task.resume()
    24. }
    Alles anzeigen
    ohne die info.plist App Transport Security bekomme ich folgendes in Console:

    App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
    Cannot start load of Task <99C35DE0-6371-4D76-973A-9BA060CDD6BE>.<1> since it does not conform to ATS policy
    Task <99C35DE0-6371-4D76-973A-9BA060CDD6BE>.<1> finished with error - code: -1022
    System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
    Reading from public effective user settings.
    The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.


    info.plist App Transport Security so angepasst

    Quellcode

    1. <key>NSAppTransportSecurity</key>
    2. <dict>
    3. <key>NSAllowsArbitraryLoads</key>
    4. <true/>
    5. <key>NSExceptionDomains</key>
    6. <dict>
    7. <key>localhost:5000</key>
    8. <dict>
    9. <key>NSExceptionAllowsInsecureHTTPLoads</key>
    10. <true/>
    11. <key>NSIncludesSubdomains</key>
    12. <true/>
    13. </dict>
    14. </dict>
    15. </dict>
    Alles anzeigen
    Console spuckt das aus:
    finished with error - code: -1004
    Could not connect to the server.

    Gruß Johann
  • Wie gesagt,

    HTML-Quellcode

    1. <key>NSAppTransportSecurity</key>
    2. <dict>
    3. <key>NSAllowsArbitraryLoads</key>
    4. <true/>
    5. </dict>
    sollte eigentlich erst mal reichen und alle http Requests erlauben.

    Evtl. fehlt Dir noch ein Content-Type application/json im Header.

    Wenn Du den Request in Chrome testest und dieser funktioniert, dann sollte Dir Chrome den kompletten Request inkl. Header anzeigen können.

    BTW: Ist dies eine macOS oder iOS App?
  • Meinst du in Coding?
    Das ist eine iOS App

    MCDan schrieb:

    Wie gesagt,

    HTML-Quellcode

    1. <key>NSAppTransportSecurity</key>
    2. <dict>
    3. <key>NSAllowsArbitraryLoads</key>
    4. <true/>
    5. </dict>
    sollte eigentlich erst mal reichen und alle http Requests erlauben.

    Evtl. fehlt Dir noch ein Content-Type application/json im Header.

    Wenn Du den Request in Chrome testest und dieser funktioniert, dann sollte Dir Chrome den kompletten Request inkl. Header anzeigen können.

    BTW: Ist dies eine macOS oder iOS App?
  • Das Device ist im gleichen WLAN Netz wie auch das Macbook.
    Im Safari auf dem Device komme ich auf den Local Server über die ip des Macs... funktioniert
    Simulator Testen, da bekomme ich in Console mecker das ARKit nicht im Simulator läuft, sonst nicht.

    habe die info.plist und das Coding jetzt so angepasst das die aktuelle ip Adresse des Macs angesprochen wird.
    Sollte ich mein "apitoken" dann nicht normalerweise vom Server wieder in die Console kriegen?
  • Habe den Key jetzt mal so in die info.plist hinzugefügt, korrekt?

    Quellcode

    1. <key>NSAppTransportSecurity</key>
    2. <dict>
    3. <key>NSAllowsLocalNetworking</key>
    4. <true/>
    5. <key>NSAllowsArbitraryLoads</key>
    6. <true/>
    7. <key>NSExceptionDomains</key>
    8. <dict>
    9. <key>10.7.100.187:5000</key>
    10. <dict>
    11. <key>NSExceptionAllowsInsecureHTTPLoads</key>
    12. <true/>
    13. <key>NSIncludesSubdomains</key>
    14. <true/>
    15. </dict>
    16. </dict>
    17. </dict>
    Alles anzeigen
    Gruß Johann