iOS App mit Login entwickeln (mit externer Datenbank)

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

  • iOS App mit Login entwickeln (mit externer Datenbank)

    Hallo zusammen,

    ich bin neu in der iOS Entwicklung und möchte für ein Studium Projekt eine App entwickeln, die einen Login beinhaltet. Es ist also hauptsächlich erstmal nur wichtig, dass es funktioniert, nicht wie sicher das ganze ist oder ähnliches, da ich die App vermutlich nur ein mal präsentiere und nicht im Store hochladen werde. Die eingegebenen Login Daten sollen an eine externe PHP Datei geschickt werden, welche diese Daten dann anhand einer MySQL Datenbank überprüft und dementsprechend zurück gibt, ob es geklappt hat oder nicht. Wenn ja soll zur nächsten View gewechselt werden und wenn nicht soll eine entsprechende Meldung ausgegeben werden.

    Noch was allgemeines: Ich benutze Xcode 7.3 und programmiere in Objective-c

    Also ich habe jetzt einen "LoginViewController". Dort habe ich zwei Textfelder und einen Login Button und diesen habe ich mit einer IBAction verknüpft. Diese Methode sieht bis jetzt so aus:

    Quellcode: LoginViewController.m

    1. - (IBAction)loginBtnTouched:(id)sender {
    2. NSURLSession *session = [NSURLSession sharedSession];
    3. NSString *url = [NSString stringWithFormat:@"http://www.meinedomain.net/iOS/meineApp/checkUserData.php?username=%@&passwort=%@", _usernameField.text, _passwordField.text];
    4. NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:url] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){
    5. NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    6. NSString *login_done = [json valueForKey:@"login_done"];
    7. NSLog(@"%@", login_done);
    8. }];
    9. [dataTask resume];
    10. }


    In der "login_done" Variable steht also jetzt entweder true oder false. Das klappt auch erstmal soweit. Jetzt möchte ich allerdings prüfen, was von beiden in "login_done" steht und dementsprechend handeln. Ich habe mir jetzt schon einen zweiten View Controller erstellt, den ich DashboardViewController genannt habe. Auf diesen soll man kommen, wenn in der "login_done" variable true steht. Das hatte ich mit folgendem Code vor:

    Quellcode

    1. if([login_done isEqualToString:@"true"]){
    2. DashboardViewController *dashboardView = [[DashboardViewController alloc]initWithNibName:nil bundle:nil];
    3. [self presentViewController:dashboardView animated:YES completion:nil];
    4. }

    Ich habe es zuerst in Zeile 29 gepackt, also noch in den Block. Da bekomme ich jetzt aber folgenden Fehler:


    Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] may only be called from the main thread.'

    Ich schätze also mal es muss außerhalb des Blocks sein. Da habe ich allerdings jetzt das Problem, dass ich nicht weiß, wie ich außerhalb des Blocks auf die Variable "login_done" zugreifen kann.

    Ich würde mich freuen wenn ihr mir helfen könntet es richtig zu machen.

    Viele Grüße
  • Danke für die Antwort. Also das mit der Notification sagt mir erstmal nichts. Brauche ich das um das Ergebnis in der property Variable zu speichern?

    Habs zumindest jetzt erstmal nur mit so einer Property Variable versucht. Habs allerdings noch nicht hinbekommen. Also am Anfang habe ich halt erstmal die property initialisiert, und zwar so:

    @property (weak) NSString *login;

    Dann habe ich in dem Block eine Zuordnung versucht, und zwar so:

    self.login = login_done;

    Wenn ich mir aber jetzt nach dem Block die login property in der Konsole ausgebe ist diese null.

    Wäre nett wenn du das noch etwas genauer erklären könntest :)
  • iNono schrieb:

    @property (weak) NSString *login;

    Nicht weak. Dir muß da der Speicher gehören.

    iNono schrieb:

    Wenn ich mir aber jetzt nach dem Block die login property in der Konsole ausgebe ist diese null.

    Der Block läuft asynchron in einem anderen Thread. Wenn Du Dir das 'nach' dem Block anschaust (im Sinne von nach den Codezeilen) ist der Block noch nicht durch und der Wert noch gar nicht gesetzt.
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • tsunamix schrieb:

    iNono schrieb:

    @property (weak) NSString *login;
    Nicht weak. Dir muß da der Speicher gehören.

    iNono schrieb:

    Wenn ich mir aber jetzt nach dem Block die login property in der Konsole ausgebe ist diese null.
    Der Block läuft asynchron in einem anderen Thread. Wenn Du Dir das 'nach' dem Block anschaust (im Sinne von nach den Codezeilen) ist der Block noch nicht durch und der Wert noch gar nicht gesetzt.
    Ok. Aber wie bzw wo genau soll die Abfrage dann sein, damit bei Erfolg auf eine neue View weitergeleitet werden kann?
  • So lange her, daß ich mich mit sowas beschäftigt habe...

    Ich würde wahrscheinlich am Ende des Blocks eine Methode des Controllers im Main Thread aufrufen... Sowas wie performSelector at main thread, wenns das gibt, oder mit GCD/ libdispatch dispatch_... whatever...
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • du kannst das doch einfach im completion-handler machen!
    falls du dich da nicht im main-thread befindest, einfach per gcd im mainthread ausführen lassen.

    den wert würde ich aber nicht als string übertragen sondern als boolschen wert. also in php false anstelle "false", denn bekommst du in cocoa eine NSNumber.

    https sollte es auch bereits bei einem test sein - dank letsencrypt ja kein problem.