我正在开发一个使用 WKWebview 来显示我的 Web 应用程序的 ios 应用程序。我的前端有一个简单的按钮,它通过window.webkit.messageHandlers.isLocationPresent.postMessage("checkLocation")
.
IOS 斯威夫特
在我看来DidLoad
let configuration = WKWebViewConfiguration()
let controller = WKUserContentController()
// name of handler called from js code
controller.add(self,name: "isLocationPresent")
configuration.userContentController = controller
let webView = WKWebView(frame: self.view.frame,configuration:configuration)
在 ios 方面,我已经通过实现了userContentController
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "isLocationPresent" {
// my logic for checking if location service is available
// if location is present the method returns true else false
let isGpsAvailable:Bool = self.checkLocationServiceState()
if isGpsAvailable {
webView.evaluateJavaScript("sendComment(\(isGpsAvailable ))", completionHandler: {(result,error) in
print(result)
print(error)
})
}
else{
// perform other logic there
}
}
}
Javascript
document.getElementById('click').onclick = function() {
window.webkit.messageHandlers.isLocationPresent.postMessage("checkLocation").
}
function sendComment(aval) {
if(aval) {
makeRequest()
}
else {
// logic to handle if false
}
}
但是每次我单击按钮时,evaluateJavascript总是抛出 Javascript Reference 错误:未找到变量 sendComment。
Web 应用程序是动态的,每个 html 元素都是由 javascript 创建的。我有三个视图,当用户单击列表时,他会转到第二个视图,其中click
呈现按钮。
因此,在页面加载时调用 webview 将不起作用,因为按钮元素未在我的第一个视图中呈现
sendComment() 函数只能由 ios 调用,当在前端单击按钮时。我还有其他用例,当用户仅在前端执行操作时,函数调用应该在 ios 中进行。