Catch Javascript Событие в iOS WKWebview с Swift
Я создаю приложение с веб-языками программирования и хочу запустить камеру, когда пользователь нажимает кнопку HTML. Поскольку я хочу, чтобы мой просмотр камеры был обычным, мне нужно создать его с помощью Swift. Поэтому, когда пользователь нажимает на эту кнопку HTML, я хочу "поймать" этот щелчок в Swift, чтобы я мог начать свой собственный просмотр камеры.
Я знаю, что это можно сделать с WKWebview, но я действительно не знаю, как это сделать.
Например, мой код Javascript (jQuery) может выглядеть так:
// User clicks to start the native camera with Swift
$(".camera_button").click(function() {
// Function to call the camera view from JS to Swift
});
Можете ли вы мне помочь?
Спасибо.
Ответы
Ответ 1
Основываясь на ответе @Alex Pelletier, который действительно помог мне, вот решение моего вопроса.
В моей функции loadView(), вот что у меня есть:
let contentController = WKUserContentController();
contentController.addScriptMessageHandler(
self,
name: "callbackHandler"
)
let config = WKWebViewConfiguration()
config.userContentController = contentController
webView = WKWebView(frame: CGRectZero, configuration: config)
webView.navigationDelegate = self
view = webView
Моя функция для обработки события Javascript, которое отправляется в Swift:
func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage)
{
if(message.name == "callbackHandler") {
print("Launch my Native Camera")
}
}
... И, наконец, мой Javascript (jQuery) код, когда клик происходит на моей кнопке камеры (в HTML):
$(document).ready(function() {
function callNativeApp () {
try {
webkit.messageHandlers.callbackHandler.postMessage("camera");
} catch(err) {
console.log('The native context does not exist yet');
}
}
$(".menu-camera-icon").click(function() {
callNativeApp();
});
});
Я надеюсь, что это поможет кому-то другому:-)!
Ответ 2
Сначала создадим файл js. В js, когда элемент был нажат, вы можете отправить сообщение так:
varmessageToPost = {'ButtonId':'clickMeButton'};
window.webkit.messageHandlers.buttonClicked.postMessage(messageToPost);
После того, как вы создали файл js и wkwebview, вам нужно ввести script:
// Setup WKUserContentController instance for injecting user script
var userController:WKUserContentController= WKUserContentController()
// Get script that to be injected into the document
let js:String= GetScriptFromResources()
// Specify when and where and what user script needs to be injected into the web document
var userScript:WKUserScript = WKUserScript(source: js,
injectionTime: WKUserScriptInjectionTime.AtDocumentEnd
forMainFrameOnly: false)
// Add the user script to the WKUserContentController instance
userController.addUserScript(userScript)
// Configure the WKWebViewConfiguration instance with the WKUserContentController
webCfg.userContentController= userController;
//set the message handler
userController.addScriptMessageHandler(self, name: "buttonClicked")
Наконец, вы должны добавить функцию прослушивателя:
func userContentController(userContentController: WKUserContentController,
didReceiveScriptMessage message: WKScriptMessage) {
if let messageBody:NSDictionary= message.body as? NSDictionary{
// Do stuff with messageBody
}
}
Исходный код