Как прагматично войти на сайт с помощью WKWebView? - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь зайти на сайт с помощью приложения. В проекте есть два контроллера представления: один с пользовательским интерфейсом входа, который я сделал, а другой с WKWebView. По сути, я хочу взять введенные пользователем параметры и отправить их в WKWebView, войти в систему и вернуть данные, которые будут представлены на другом контроллере представления.

Примечание. Я уже пытался найти API, но на этом веб-сайте нет ни одного доступного

Вот как я сейчас это делаю, но я сталкиваюсь с принудительным развертыванием возвращенной ошибки Nill.

Просмотр контроллера с WebView

import UIKit
import WebKit

class Web_View: UIViewController, WKUIDelegate {



var webView: WKWebView!
var viewControllerManager : ViewController!




override func viewDidLoad() {
    super.viewDidLoad()

    let HAC_URL = URL(string:"https://hac.friscoisd.org/HomeAccess/Account/LogOn?ReturnUrl=%2fhomeaccess%2f")
    let request = URLRequest(url: HAC_URL!)
    webView.load(request)
}

//loadsBackgroundView
override func loadView() {
    let webConfig = WKWebViewConfiguration()
    webView = WKWebView(frame: .zero, configuration: webConfig)
    webView.uiDelegate = self
    view = webView
}

//Username manager
func webViewDidFinishLoadUsername() {
    webView.evaluateJavaScript("document.getElementByTagName(\"input\")[2].value = \(viewControllerManager.username)") {(result, error) in

        if error != nil
        {
            print(result!)
        }
        else
        {
            print(error!)
        }
    }
}
//Password manager
func webViewDidFinishLoadPassword() {
    webView.evaluateJavaScript("document.getElementByTagName(\"input\")[1].value = \(viewControllerManager.password)") {(result, error) in

        if error != nil
        {
            print(result!)
        }
        else
        {
            print(error!)
        }
    }

}

/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destination.
    // Pass the selected object to the new view controller.
}
*/
}

Контроллер пользовательского интерфейса входа в систему

import UIKit
import WebKit

class ViewController: UIViewController{

//Outlets and variables
let webViewControllerObject = Web_View()


var username : String = ""
var password : String = ""

@IBOutlet weak var errorLabel: UILabel!

@IBOutlet weak var usernameTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!


//Allows user to "touch off" the keyboard
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

}



//Gathers data and holds in two varables, sends username params
@IBAction func loginRequest(_ sender: Any) {

    username = usernameTextField.text!
    password = passwordTextField.text!

    if (username.isEmpty || password.isEmpty)
    {
        errorLabel.text = "Please enter a valid login"
    }

    else if (!(username.isEmpty || password.isEmpty))
    {
        webViewControllerObject.webViewDidFinishLoadUsername()
        webViewControllerObject.webViewDidFinishLoadPassword()
    }

    else
    {
        print("rough")
    }

}


}

Если есть лучший способ сделать это, пожалуйста, сообщите мне

Редактировать Это линия, я думаю, нуждается в исправлении

var webView: WKWebView!

var viewControllerManager: ViewController!

Ошибка появляется в этой строке webView.evaluateJavaScript ("document.getElementByTagName (\" input \ ") [2] .value = (viewControllerManager.username)") {(результат, ошибка) в

У меня есть догадка, потому что я снова распаковываю силой

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Hidde the WebView

webView.isHidden = true
webView.isHidden = false
0 голосов
/ 02 января 2019

Вам следует избегать принудительного развертывания, например, так:

username = usernameTextField.text!

if let usernameText = usernameTextField.text { 
    username = usernameText
}

Поскольку я не могу добавлять комментарии, я предположил, чтоВаша единственная проблема - " принудительное развертывание вернуло Ошибка Nill ".Выше мое предложение избегать этого.

...