Swift post 从 WebView 到原生应用的数据
Swift post data from WebView to native app
我创建了一个 HTML 文件,其中包含 userName
和 password
字段以及一个提交按钮。通过按下提交按钮,一个 JavaScript 函数被调用到 return userName
值。我有一个包含顶部标签和 WebView 的本机应用程序。 WebView 使用该 HTML 文件呈现。我需要将 WebView 中的用户名作为 ViewController 中的标签文本发送。我尝试在 UIWebViewDelegate
的 webViewDidFinishLoad
函数中使用 stringByEvaluatingJavaScript
但它对我的问题不起作用,因为我需要在按下提交按钮后传递数据,而不是在 WebView 完成加载时传递数据尚未在用户名字段中输入任何数据!
我想出了解决办法:
我使用 'Form' 元素创建了一个包含用户名、密码和提交按钮的表单,在 Swift 应用程序中我使用了 shouldStartLoadWith 请求 WebView 的委托函数。每次点击提交按钮时,都会调用此函数来访问表单元素。然后我调用了 stringByEvaluatingJavaScript 函数来访问 HTML 文件中的 javascript 函数。这是代码:
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if (navigationType == UIWebViewNavigationType.formSubmitted) {
// form is submitted or button is clicked , perform your actions here
//let result = webView.stringByEvaluatingJavaScript(from: "document.getElementById('form1').elements[0].value")!
let result = webView.stringByEvaluatingJavaScript(from: "window.myFunc()")!
lbl.text = result
}
return true
}
这里是 HTML 文件:
<body>
<form id="form1" name="form1" action="myFunc()" onsubmit="return validateForm()" method="post">
First name:<br>
<input type="text" name="username" id="user">
<br>
Password:<br>
<input type="password" name="password">
<br><br>
<input type="submit" value="Submit">
</form>
<Script>
function myFunc(){
var user = document.getElementById('form1').elements[0].value;
//document.getElementById("button").innerHTML = user;
return user;
}
function validateForm() {
var x = document.forms["form1"]["username"].value;
var y = document.forms["form1"]["password"].value;
if (x == "") {
alert("Name must be filled out");
return false;
}
if (y == "") {
alert("Password must be filled out");
return false;
}
if (x== "" && y == "") {
alert("Fields must be filled out");
return false;
}
}
</Script>
</body>
我创建了一个 HTML 文件,其中包含 userName
和 password
字段以及一个提交按钮。通过按下提交按钮,一个 JavaScript 函数被调用到 return userName
值。我有一个包含顶部标签和 WebView 的本机应用程序。 WebView 使用该 HTML 文件呈现。我需要将 WebView 中的用户名作为 ViewController 中的标签文本发送。我尝试在 UIWebViewDelegate
的 webViewDidFinishLoad
函数中使用 stringByEvaluatingJavaScript
但它对我的问题不起作用,因为我需要在按下提交按钮后传递数据,而不是在 WebView 完成加载时传递数据尚未在用户名字段中输入任何数据!
我想出了解决办法: 我使用 'Form' 元素创建了一个包含用户名、密码和提交按钮的表单,在 Swift 应用程序中我使用了 shouldStartLoadWith 请求 WebView 的委托函数。每次点击提交按钮时,都会调用此函数来访问表单元素。然后我调用了 stringByEvaluatingJavaScript 函数来访问 HTML 文件中的 javascript 函数。这是代码:
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if (navigationType == UIWebViewNavigationType.formSubmitted) {
// form is submitted or button is clicked , perform your actions here
//let result = webView.stringByEvaluatingJavaScript(from: "document.getElementById('form1').elements[0].value")!
let result = webView.stringByEvaluatingJavaScript(from: "window.myFunc()")!
lbl.text = result
}
return true
}
这里是 HTML 文件:
<body>
<form id="form1" name="form1" action="myFunc()" onsubmit="return validateForm()" method="post">
First name:<br>
<input type="text" name="username" id="user">
<br>
Password:<br>
<input type="password" name="password">
<br><br>
<input type="submit" value="Submit">
</form>
<Script>
function myFunc(){
var user = document.getElementById('form1').elements[0].value;
//document.getElementById("button").innerHTML = user;
return user;
}
function validateForm() {
var x = document.forms["form1"]["username"].value;
var y = document.forms["form1"]["password"].value;
if (x == "") {
alert("Name must be filled out");
return false;
}
if (y == "") {
alert("Password must be filled out");
return false;
}
if (x== "" && y == "") {
alert("Fields must be filled out");
return false;
}
}
</Script>
</body>