簡體   English   中英

WkWebView 消息處理程序第一次不返回文本框的值,但它在我第二次按下按鈕時返回

[英]WkWebView Message handler doesn't return the value of textbox first time, but it does the second time I press the button

所以,我有一個帶有文本框的 HTML 表單。 我在 WKWebView 中加載表單,並在我的 Swift 應用程序中使用消息處理程序,以便能夠轉儲文本框的內容並稍后在 Swift 變量中使用它。

問題是,當我按下觸發獲取文本框值的 javascript function 的注冊按鈕時,第一個結果是空白。 不是 null,只是一個空格。

如果我再次按下按鈕,我會得到文本框的實際內容。 我嘗試使用 evaluateJavascript function 通過 ID 獲取元素,同樣的事情,第一次我什么也沒得到,第二次我得到預期值。

我的 ViewController 的代碼:

private var webkitview: WKWebView!
    var lsusername = "";
    var lspassword = "";
    
    @IBOutlet weak var baseview: UIView!
    @IBOutlet weak var registerAccountButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        self.webkitview = WKWebView(frame: self.baseview.bounds, configuration: self.getWKWebViewConfiguration())
        baseview.addSubview(self.appvalleyRegistration)
        baseview.translatesAutoresizingMaskIntoConstraints = false;
        
        let url = URL(string: "https://redacted.com/registrationform.php")!
        webkitview.load(URLRequest(url: url))

    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        setNeedsStatusBarAppearanceUpdate()
    }
    override var preferredStatusBarStyle: UIStatusBarStyle {
        .darkContent
    }
    
    
    private func getWKWebViewConfiguration() -> WKWebViewConfiguration {
            let userController = WKUserContentController()
            userController.add(self, name: "observer")
            let configuration = WKWebViewConfiguration()
            configuration.userContentController = userController
            return configuration
    }
        
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if let data = message.body as? [String : String], let passw = data["passw"], let email = data["email"] {
            lsusername = email;
            lspassword = passw;
        } else {
            print("No data.");
        }
    }
    
    @IBAction func registerUser(_ sender: Any) {
        webkitview.evaluateJavaScript("submitForm()");
        showUser(email: lsusername, name: lspassword);
    }
    
    private func showUser(email: String, name: String) {
            let userDescription = "\(email) \(name)"
            let alertController = UIAlertController(title: "User", message: userDescription, preferredStyle: .alert)
            alertController.addAction(UIAlertAction(title: "OK", style: .default))
            present(alertController, animated: true)
    }

我第一次使用showUser()觸發的警報是空白的,如果我再次按下按鈕,它會顯示從 Webkit 中的頁面抓取的正確用戶名和密碼。

我的表格:

<body>
<script type="text/javascript">
          function submitForm() {
              var message = {
                passw: document.getElementById("passw").value,
                email: document.getElementById("email").value
              };
              window.webkit.messageHandlers.observer.postMessage(message);
          }
</script>
  <div class="container">
    <h1>Welcome to my site</h1>
    <p>Let's set up your account</p>
    <hr>

    <label for="email"><b>Email</b></label>
    <input type="text" placeholder="Enter Email" name="email" id="email" required>

    <label for="psw"><b>Password</b></label>
    <input type="password" placeholder="Enter Password" name="passw" id="passw" required>

    <label for="psw-repeat"><b>Repeat Password</b></label>
    <input type="password" placeholder="Repeat Password" name="psw-repeat" id="psw-repeat" required>
  </div>
</body>

我不明白為什么它第二次起作用,但不是第一次。

我嘗試添加sleep()以等待 JS 完全完成評估,但仍然沒有。

evaluateJavascript是一個異步的 function。 嘗試添加一個完成塊並在其中調用showUser (但請確保在主線程上觸發 UI 更新)。 我認為這應該可以解決您的直接問題:

webkitview.evaluateJavaScript("submitForm()") { [weak self] (_, _) in
    DispatchQueue.main.async { [weak self] in
        guard let self = self else { return }
        self.showUser(email: self.lsusername, name: self.lspassword)
    }
}

在更高級別的說明中,從 WKUserContentController 的didReceive WKUserContentController中調用showUser是否更有意義? 我沒有用過這么多,所以我在這里可能是錯的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM