背景:mac下webengine的库体积太大了,想要减少点库体积,所以采用oc原始进行网页交互
通过WKWebView进行拦截代理,实现数据交互
1、js到oc/Qt
2、Qt/OC到js
为了便于后续复用,新的QWidget只需要基于IMessageHandler接口类实现doHandle(),不需要重新写一遍OC代码。
js往OC发送数据
function sendJsMessageToObjectiveC(msg) {
window.webkit.messageHandlers.customMessageHandler.postMessage(msg);
}
其中 customMessageHandler 是在oc中注册的
注:msg一般采用json,便于后续拓展
Qt/OC 往 js发送数据
CustomOCWebView * webView = [[CustomOCWebView alloc] init];
if(nil != webView) {
[webView setUrl: appDir.append("/index.html").toNSString()];
[webView setMessageHandler: MessageHandlerService::instance()];
[webView loadUrl];
QWidget* widget = QWidget::createWindowContainer(QWindow::fromWinId(WId(webView->pWebView)));
if(nullptr != widget){
ui->vLayMain->addWidget(widget);
}
}
connect(ui->btnToJs, &QPushButton::clicked, this, [=] {
[webView sendMessage: QString("recvMessageFromObjectiveC").toNSString() msg:QString("msg from Qt/Oc").toNSString()];
});
api为: -(void) sendMessage: (NSString*) apiName msg:(NSString*) message
github地址:GitHub - yanhj/WebViewDemo: Qt OC JavaScript Communication Demo