2017-09-16 45 views
0

我正在嘗試創建一個應用程序,其中用戶通過我的用戶界面登錄。我有我拉取數據的textLabel,我希望指出這些數據並使用它登錄到網站並在登錄後獲取數據。我現在擁有的是一個WKWebView,它在加載大部分時間時是不可見的我想登錄的網站,然後填寫表格中的日誌並點擊按鈕 - 全部通過evaluateJavaScript。我現在唯一的問題是,我試圖想出一些能夠檢查用戶是否登錄不正確的東西。我試圖做的是等到javascript執行,然後檢查webView並查看url是否已更改爲登錄頁面。但是,只有在用戶沒有輸入正確的密碼時纔有效。如果他們收到一次錯誤的密碼,那麼之後的所有條目都會說密碼不正確。我使用觀察值來檢查頁面是否完成加載,但我需要幫助實現這一點。如何通過swift登錄IOS應用程序中的網站/ javascript

@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; 

     } 




    }) } 

我是一個新的iOS開發者,但我不想放棄這一點,如果你有任何幫助,或者有更好的方式建議等待JavaScript來點擊按鈕和頁面到fullyload請分享

編輯: 我想我找到了一個解決方案,但由於某種原因,現在的登錄按鈕被點擊已經爲它處理任何事情的兩倍......

@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 
      } 
     } 
    } 

回答

0

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

確保將WKWebView的代理設置爲您的視圖控制器

+0

我設置了WebView的委託但仍然不會被調用... –