Javascript ile uygulama geliştirirken kotlin'de kullanılan addJavascriptInterface metodunda return kullanarak asenkron kodlar çalıştırabiliyoruz. Aynısını ios cihazlarda swift ile de yapabiliyoruz.
Bunun için WKScriptMessageHandler yerine WKScriptMessageHandlerWithReply classını kullanmalıyız.
updateUIView fonskiyonunun içinde addScriptMessageHandler tanımlamamızı yapıyoruz.
let contentController = ContentController() //ContentController classımızı bir sonraki adımda oluşturacağız
webView.configuration
.userContentController
.addScriptMessageHandler(
contentController,
contentWorld: WKContentWorld.page,
name: "ParentAPP" // javascript ile erişeceğimiz messageHandler'ın adı
)
şimdi sıra ContentController classımızı oluşturmaya geldi.
class ContentController: NSObject, WKScriptMessageHandlerWithReply {
func userContentController(
_ userContentController: WKUserContentController,
didReceive message: WKScriptMessage,
replyHandler reply: @escaping (Any?, String?) -> Void) {
//Javascript ile gönderdiğimiz parametre json olacağı için parse işlemi yapıyoruz.
// Örn: {"action":"getCurrentPosition", "message":"Test"}
let json = message.body as! [String: Any]
let action = json["action"] as! String
let message = json["message"] as! String
switch action {
case "getCurrentPosition": //action
reply(message) // bu return olarak javascript'e geri dönecektir
break
default:
break
}
}
}
Buraya kadar herşey tamamsa Javascript ile devam edelim;
async function getCoordinates(){
let coords = await window.webkit.messageHandlers.ParentAPP.postMessage({
action: "getCurrentPosition",
message: "Deneme"
});
console.log(coords) // örnek kodumuzda json'daki message değerini geri dönmesini istediğimiz için bize "Deneme" stringini dönecektir. ContentController içinde bulunan reply fonksiyonuna başka şeyler yazdırarak farklı yanıtlar alabilirsiniz.
}