Swift webview: Jak poprawnie wywołać kod Swift z javascript?


Próbuję zmusić mój javascript do interakcji z szybkim kodem, ale niestety mi się to nie udało.
Na razie próbowałem tylko zmienić kolory nagłówka i wyświetlić komunikat, jak zobaczysz w poniższym kodzie.
Oto mój kod (

index.html

) :
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<meta charset="UTF-8">
</head>
<body>
[b]WebView Test[/b]>
<script type="text/javascript" src="main.js"></script>
</body>
</html>

Oto mój kod (

main.js -JavaScript

) :
function callNativeApp () {
try {
webkit.messageHandlers.callbackHandler.postMessage("Send from JavaScript");
} catch(err) {
console.log('error');
}
}setTimeout(function () {
callNativeApp();
}, 5000);function redHeader() {
document.querySelector('h1').style.color = "red";
}

Oto mój kod (

ViewController.swift

) :
import UIKit
import WebKitclass ViewController: UIViewController, WKScriptMessageHandler { @IBOutlet var containerView : UIView! = nil var webView: WKWebView? override func loadView() {
super.loadView() var contentController = WKUserContentController();
var userScript = WKUserScript( source: "redHeader()",
injectionTime: WKUserScriptInjectionTime.AtDocumentEnd,
forMainFrameOnly: true
)
contentController.addUserScript(userScript)
contentController.addScriptMessageHandler( self,
name: "callbackHandler"
) var config = WKWebViewConfiguration()
config.userContentController = contentController self.webView = WKWebView()
self.view = self.webView!
} override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var url = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("index", ofType: "html")!)
var req = NSURLRequest(URL: url)
self.webView!.loadRequest(req)
} func userContentController(userContentController: WKUserContentController!,didReceiveScriptMessage message: WKScriptMessage!) {
if(message.name == "callbackHandler") {
println("JavaScript is sending a message \(message.body)")
} } override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Masz wszystko poprawnie skonfigurowane, ale nie przekazujesz swojej instancji
WKWebViewConfiguration
do
WKWebView
. Ponieważ konfiguracja zawiera szczegóły mostka Javascript/Swift, nie można rozmawiać w tę iz powrotem.
override func loadView() {
// ...
var config = WKWebViewConfiguration()
config.userContentController = contentController self.webView = WKWebView(frame: self.view.frame, configuration: config)
self.view = self.webView!
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

moje 2 centy za pomocą wywołania zwrotnego javascript z JSON ... aby uzyskać pełną definicję klasy i układu, odwołaj się do kodu adama
import UIKit
import WebKitclass ViewController: UIViewController, WKScriptMessageHandler {
var webView: WKWebView?
...

następnie
override func loadView() {
let theConfiguration = WKWebViewConfiguration()
let contentController = theConfiguration.userContentController// alert fix, at start to allow a JS script to overwrite it
contentController.addUserScript( WKUserScript( source: "window.alert = function(message){window.webkit.messageHandlers.messageBox.postMessage({message:message});};",
injectionTime: WKUserScriptInjectionTime.AtDocumentStart,
forMainFrameOnly: true
) )
contentController.addScriptMessageHandler(self, name: "messageBox") self.webView = WKWebView(frame: self.view.frame, configuration: theConfiguration)// and here things like: self.webView!.navigationDelegate = self
self.view = self.webView!// fill controllers view
}

a konkretnie
func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) { if message.name == "messageBox" {
let sentData = message.body as! Dictionary<String, String> let message:String? = sentData["message"] let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert)
alertController.addAction(UIAlertAction(title: NSLocalizedString("OK", comment:"btnOK"), style: .Default, handler: nil))
self.presentViewController(alertController, animated: true) {}
}
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się