Swift native webview'a return dönebilir mi?

Swift native webview'a return dönebilir mi?

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.
}

Comments


Yorum yazın







Tarih: