NSURLConnection oder NSURLSession für Datenbankanbindung?

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

  • NSURLConnection oder NSURLSession für Datenbankanbindung?

    Hallo liebe Forum-Mitglieder,

    derzeit Arbeite ich daran, meiner App eine Verbindung zu einer Datenbank zu verhelfen. Habe auch schon eineiige Tutorials dazu gelesen. Nun habe ich darauf hin mir einen Ubuntu Server in einer VBox erstellt und dort eine Mysql Datenbank laufen. Zusätzlich einen apache2 server für die php skripte(für den Datenbankzugriff und das zurückgeben von json) auf die ich dann per Url drauf zu greifen kann. Nun habe ich eine Präsentation con der Macon.de aus dem Jahre 2013 mir angeschaut(macoun.de/video2013gssa3.php).
    Darin geht es um die sichere Verschlüssellung von Verbindungen, was natürlich in meiner App nicht fehlen sollte. Ich habe allerdings auch schon gelesen das es sowas wie NSURLSession gibt.
    Meine Frage ist einfach was ich nun nutzen soll Ist NSURLConnection schon veraltet? Oder sollte ich besser NSURLSession nutzen. Habt ihr dafür vllt. ein paar links zum lesen für mich? Ist mein Setup gut oder gibt es bessere Verfahren dies um zu setzen?

    Wie nutze/erstelle ich selbst gemachte Zertifikate und wie teuer sind offizielle SSL Zertifikate?


    Viele Grüße Rocks360 :)
  • die klassen machen sicherheitstechnisch keinen großen unterschied.
    es geht nur darum ob du https verwendest oder nur http und ob du di zertifikate validierst (pinning etc) oder nicht.

    selbstsignierte zertifikate kosten nichts und reichen aus wenn es nur für deine app verwendet wird. andernfalls kostet ein offizielles ca 7 euro pro jahr (Comodo PositiveSSL).
  • Super danke schon mal für die Infos.
    Meint ihr, es wäre sinnig für die Verbindung eine Library zu erstellen und diese dann in mein Projekt zu integrieren? Da ich noch eine zweite App schreiben möchte die an die selbe Datenbank angebunden werden soll.

    Nun hab ich jedoch noch ein allgemeines Problem. Und zwar wenn ich meine Anwendung zum ersten mal Starte, erscheint ja der, ich nenne es mal nen ersten ViewController. Von da aus läuft dann die Anmeldung und der User wird zum Nächten ViewController weiter geleitet. Wenn ich nun aber im IOS-Simulator den home-button klicke und dann die App neu Starte, öffnet er Immer den zuletzt angezeigten ViewController, was er ja nicht geschehen soll. sondern es soll dann immer der erste ViewController mit der Anmeldung angezeigt werden. Habt ihr da vllt. eine Idee, wie sich das umsetzten lässt?
  • Dies liegt daran, dass eine App mit Betätigung des Home-Buttons nicht automatisch beendet, sondern nur in den Hintergrund gelegt wird. Dies kannst Du über eine Einstellung in der Info.plist ("Application does not run in background" bzw. UIApplicationExitsOnSuspend) beeinflussen.

    Alternativ lässt Du die App einfach "weiter laufen" bzw. pausieren und zeigst, wie von macmoonshine bereits vorgeschlagen, beim Aktivieren der App den gewünschten ViewController an.
  • Rocks360 schrieb:


    Nun hab ich jedoch noch ein allgemeines Problem. Und zwar wenn ich meine Anwendung zum ersten mal Starte, erscheint ja der, ich nenne es mal nen ersten ViewController. Von da aus läuft dann die Anmeldung und der User wird zum Nächten ViewController weiter geleitet. Wenn ich nun aber im IOS-Simulator den home-button klicke und dann die App neu Starte, öffnet er Immer den zuletzt angezeigten ViewController, was er ja nicht geschehen soll. sondern es soll dann immer der erste ViewController mit der Anmeldung angezeigt werden. Habt ihr da vllt. eine Idee, wie sich das umsetzten lässt?


    Bist du sicher, dass Du das willst? Was ist wenn der User gerade mit deiner App arbeitet und dann schnell nur mal im Kalender nachsehen will ob er morgen einen Termin hat. Oder was ist wenn eine SMS reinkommt die er mal eben lesen will? Dann muss er danach immer wieder in deiner App von vorne anfangen. Finde ich keine kluge Lösung.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • macmoonshine schrieb:

    Du kannst im App-Delegate in der Methode applicationDidBecomeActive: sicherstellen, dass die App zu Beginn und nach dem Aufwachen aus dem Hintergrund den gewünschten Viewcontroller anzeigt.


    Hast du dafür evt. ein Beispiel? Ich weiß wie mann per Code einen ViewController mit .xib file initialisiert aber einen X-beliebigen im Storyboard leider nicht. Gibt es da von Apple ein Guide ?
    Im App delegate gibt es ja mehrere Funktionen... wäre ja dann auch super wenn ich dir den User abmelde und dort Methoden für das Speichern der Einstellungen etc. schreibe. Wie kann ich dann aber von dort aus auf die Objekte zugreifen, die ich in den ViewControllern verwende?

    Mit der info.plist ist ein guter Tipp das funktioniert auch schon jetzt super. :) Danke!
  • Rocks360 schrieb:

    Ich weiß wie mann per Code einen ViewController mit .xib file initialisiert aber einen X-beliebigen im Storyboard leider nicht.

    Siehe instantiateInitialViewController

    Quellcode

    1. ​id theController = self.window.rootViewController;
    2. UIStoryboard *theStoryboard = [theController storyboard];
    3. self.window.rootViewController = [theStoryboard instantiateInitialViewController];
    „Meine Komplikation hatte eine Komplikation.“
  • Jetzt habe ich noch ein paar weitere Fragen. Macht es sinn, ein Singelton pattern für die NSURLSession zu nutzen, auf die dann jede Klasse z.B. Person zugreift um mit einer Methode: userByName(name); die ganzen Daten zu der Person mit einem NSMutableURLRequest die Daten aus der Datenbank holt? ich habe hier mal ein kurzen sourcecode :

    Quellcode

    1. -(User *)userByName:(NSString *)userName{
    2. User *user = [[User alloc] init];
    3. [user setUserName:userName];
    4. NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    5. [request setHTTPMethod:@"POST"];
    6. NSDictionary *dictionary = @{@"Benutzername" : userName};
    7. NSError *error = nil;
    8. NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary
    9. options:kNilOptions error:&error];
    10. if(!error){
    11. NSURLSessionUploadTask *uploadTask = [[connection customSession] uploadTaskWithRequest:request
    12. fromData:data completionHandler:^(NSData *data,NSURLResponse *response,NSError *error) {
    13. // Handle response here
    14. if(!error){
    15. NSLog(@"Kein error");
    16. }
    17. else{
    18. NSLog(@"Fehler bei get User", error);
    19. }
    20. }];
    21. [uploadTask resume];
    22. }
    23. return user;
    24. }
    Alles anzeigen


    Desweiteren wenn ich nun beim NSMutableURLRequest die Methode [request setHTTPMethod:@"POST"]; setzekann ich das dann auf dem weiserver mit php als $_POST['Benutzername'] weiter verarbeiten? Und wie kann man sslpinning durchführen bzw. den response auf Fehler bei einer REST-pattern-api behandeln. Da ich ja nicht direkt den error an die app zurück sende falls einer entsteht z.B. Benutzer nicht gefunden. ich habe bis her nur gesehen das die das in z.B. einen string packen und denn dann zurück senden ... ist das normal? oder gibt es da eine Methode das wenn php eine exception wirft, diese direkt an die app weiter geleitet wird und in der app weter verarbeitet werden kann?

    Viele Grüße

    Rocks360
  • Rocks360 schrieb:

    Macht es sinn, ein Singelton pattern für die NSURLSession zu nutzen, auf die dann jede Klasse z.B. Person zugreift um mit einer Methode: userByName(name); die ganzen Daten zu der Person mit einem NSMutableURLRequest die Daten aus der Datenbank holt?

    Nein, wozu soll das gut sein? Singletons machen allenfalls Sinn, wenn sie Daten oder Ressourcen verwalten, die es nur einmal geben darf; aber selbst dann lassen sie sich häufig vermeiden. Das ist hier nicht der Fall.
    „Meine Komplikation hatte eine Komplikation.“
  • Ich habe mich für das Singelton entschieden, da ich dies schon einmal bei einem Javaprojekt verwendet habe für die Uni, da ging es darum, eine Verbindung zu dem Server auf zu bauen und immer über diese Connection zu gehen. Mir erschien es sinnvoll dies auch für meine kleine App zu nutzen und wollte deshalb eine NSULSession haben, über die alle abfragen laufen, das ist ja aber wohl nicht der Idealweg, weshalb ich den nun nicht weiter verfolgen werde!
    Wie ist das mit einer Kategorie gemeint? Ist damit gemeint, wenn ich z.B. Informationen zu einem oder mehrerer Mitarbeiter aus einer Datenbank laden möchte, erstelle ich dafür ein Session ? ebenso eine Session für z.B. wenn ich Produkte aus der Datenbank laden möchte? Und wo deklariere ich die Session dann am besten , im ViewController oder in der klasse Mitarbeiter, Produkt? Gibt es für so etwas evt. ein paar Beispiel-Designs von Apps? Wie macht ihr Profis das?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Rocks360 ()