2017-09-16 3 views
0

Ich versuche, eine Anwendung zu erstellen, wo sich der Benutzer über meine Benutzeroberfläche anmeldet. Ich habe TextLabels, die ich Daten ziehe, ich möchte taje die Daten und verwenden Sie es, um sich auf einer Website online anmelden und Daten sobald eingeloggt bekommen. Was ich gerade habe, ist ein WKWebView, das die meiste Zeit unsichtbar ist, die geladen wird die Webseite, in die ich mich einloggen möchte, füllt dann die Anmeldeformulare aus und klickt auf die Schaltfläche - alles über evaluateJavaScript. Mein einziges Problem im Moment ist, dass ich versuche, etwas zu finden, das prüfen kann, ob sich der Benutzer falsch angemeldet hat. Was ich versuche zu tun ist zu warten, bis das Javascript ausgeführt wird, dann überprüfe das WebView und sehe, ob die URL auf die Anmeldeseite gewechselt hat. Dies funktioniert jedoch nur, wenn der Benutzer nicht ein korrektes Passwort eingegeben hat. Wenn sie einmal ein falsches Passwort erhalten, sagen alle nachfolgenden Einträge das Passwort falsch. Ich benutze einen Beobachtungswert, um zu überprüfen, ob die Seite geladen wurde, aber ich brauche Hilfe bei der Implementierung.Wie logge ich mich in einer IOS APP über swift/javascript ein

@IBAction func loginBtnPressed(_ sender: Any) { 
    if(!validate(usernameText) || !validate(passwordText)) 
    { 
     self.validationLabel.text = "One or more fields are empty." 
     UIView.animate(withDuration: 0.25, animations: { 
     self.validationLabel.isHidden = false 
     }) 
     return; 
    } 
    let oldUrl = webView.url?.absoluteString; 
    self.validationLabel.isHidden = true 

     webView.evaluateJavaScript("document.getElementById('fieldAccount').value = \(usernameText!.text!)", completionHandler: {(result,err) in print(result ?? "No Result"); print (err ?? "No Error") }) 
     webView.evaluateJavaScript("document.getElementById('fieldPassword').value = '\(passwordText!.text!)'", completionHandler: {(result,err) in print(result ?? "No Result"); print (err ?? "No Error") }) 
     webView.evaluateJavaScript("document.getElementById('btn-enter').click()", completionHandler: {(result,err) in 
      print(result ?? "No Result"); print (err ?? "No Error") }) 


    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(6), execute: { 
      // Put your code which should be executed with a delay here 


    if(self.webView.url?.absoluteString.contains("termGrades"))! 
    { 
     print("We're in bois: ") 
     self.view = self.webView 
    }else 
    { 


     print("Did not get to grades page..") 

     self.validationLabel.text = "Invalid Username/Password" 
     UIView.animate(withDuration: 0.25, animations: { 
      self.validationLabel.isHidden = false 
     }) 
     let portalURL = URL(string: "*website*") 
     let request = URLRequest(url: portalURL!) 
     self.webView.load(request) 

     return; 

     } 




    }) } 

Ich bin ein neuer ios Entwickler, aber ich möchte nicht auf diese verzichten, wenn Sie haben jede mögliche Hilfe, oder Vorschläge zu einer besseren Art und Weise für die Javascript warten auf die Schaltfläche und die Seite klicken bitte teilen

EDIT fullyload: ich denke, dass ich eine Lösung gefunden, aber aus irgendeinem Grund jetzt die Login-Schaltfläche geklickt werden muss, um zweimal dafür, alles zu verarbeiten ...

@IBAction func loginBtnPressed(_ sender: Any) { 
    if(!validate(usernameText) || !validate(passwordText)) 
    { 
     self.validationLabel.text = "One or more fields are empty." 
     UIView.animate(withDuration: 0.25, animations: { 
     self.validationLabel.isHidden = false 
     }) 
     return; 
    } 
    self.validationLabel.isHidden = true 

     webView.evaluateJavaScript("document.getElementById('fieldAccount').value = \(usernameText!.text!.description)", completionHandler: {(result,err) in print(result ?? "No Result"); print (err ?? "No Error") }) 
     webView.evaluateJavaScript("document.getElementById('fieldPassword').value = '\(passwordText!.text!)'", completionHandler: {(result,err) in print(result ?? "No Result"); print (err ?? "No Error") }) 
     webView.evaluateJavaScript("document.getElementById('btn-enter').click()", completionHandler: {(result,err) in 
      print(result ?? "No Result"); print (err ?? "No Error") }) 
} 


override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    if keyPath == "loading" 
    { 
     if(!webView.isLoading) { 
      print("Finished navigating to url \(webView.url!)"); 
      if(webView.url! == URL(string: "**")) 
      { 
       statusLabel.text = "Done." 
      }else if(webView.url! == URL(string: "**")) 
      { 
       self.validationLabel.text = "Invalid Username/Password" 
       UIView.animate(withDuration: 0.25, animations: { 
        self.validationLabel.isHidden = false 
       }) 
      }else if(webView.url! == URL(string: "**")) 
      { 
       self.view = webView 
      } 
     } 
    } 

Antwort

0

func webView(webView: WKWebView!, didFinishNavigation navigation: WKNavigation!) { print("Finished navigating to url \(webView.url)"); }

Stellen Sie sicher, dass Sie den Stellvertreter des WKWebView auf Ihren View-Controller setzen

+0

Ich setze den Delegaten der WebView, aber wird immer noch nie aufgerufen ... –

Verwandte Themen