javascript - webkit.messageHandlers 用于 React 将 JavaScript 注入 Swift
问题描述
我正在使用 WKWebView,我正在加载要显示的网页(React)。但是我的 didFinish 被触发得太早了。因此,当我的代表通知 didFinish 时,在加载实际数据之前,我只会看到几秒钟的白屏。
这不起作用,导致白屏 - 在显示实际内容之前
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
activityIndicator?.stopAnimating()
}
相反,我读了这篇文章,告诉我应该可以通过让网页在加载时通知 Swift 代码来实现。
https://medium.com/capital-one-developers/javascript-manipulation-on-ios-using-webkit-2b1115e7e405
我确实在我的 Xcode 项目中实现了以下代码
override func viewDidLoad() {
super.viewDidLoad()
let userContentController = WKUserContentController()
userContentController.add(self, name: "test")
}
extension DashboardViewController: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "test", let messageBody = message.body as? String {
print(messageBody)
}
}
}
但是,现在我们在这里。我不知道把它放在哪里,因为我的网络应用程序是用 React 编写的。
<script>
function printHelloWorld() {
window.webkit.messageHandlers.test.postMessage("Did finish loading");
}
window.onload = printHelloWorld;
</script>
我的反应组件
class Page extends React.Component<{ location, match }> {
public render() {
const content = (
<div className="row">
<p>Content</p>
</div>
);
return (
content
)
}
}
export default Page;
谁能告诉我,如何window.webkit.messageHandlers.test.postMessage
在我的 React 组件中使用?
解决方案
尝试在组件挂载时调用该函数:
class Page extends React.Component<{ location, match }> {
componentDidMount() {
window.webkit.messageHandlers.test.postMessage("Did finish loading");
}
render() {
...
}
}
这有点像React组件的加载。
有关componentdidmount的更多信息
推荐阅读
- reactjs - ReactJs -> 使用 .net 框架自动完成文本框
- node.js - 为什么我的应用程序在 docker 容器内运行时侦听端口 80 而不是端口 3000?
- java - 我是否用这个令牌替换代码重新发明轮子?
- mysql - 将 django 与 WSGI 一起使用时导入错误
- ios - 如何在swift4的tableview单元格中使用按钮获取JSON id
- sql - 汽车经销商库存订单清单
- validation - 在 go 中验证 http 请求的惯用方法
- html - html css将img移动到div的最上面一行
- php - SQLite3Result 类的对象无法转换为 int
- javascript - 如何从 JS 文件中的 WP-Config.php 读取全局变量