Как вызвать функцию JavaScript из WKWebview при получении сообщения из веб-приложения - PullRequest
0 голосов
/ 02 ноября 2018

Я разрабатываю приложение ios, которое использует WKWebview для отображения моего веб-приложения. У меня есть простая кнопка в моем веб-интерфейсе, которая отправляет сообщение в WKWebview через window.webkit.messageHandlers.isLocationPresent.postMessage("checkLocation").

IOS Swift

На мой взгляд DidLoad

let configuration = WKWebViewConfiguration()
 let controller = WKUserContentController()

// name of handler called from js code
controller.add(self,name: "isLocationPresent")
configuration.userContentController = controller

let webView = WKWebView(frame: self.view.frame,configuration:configuration)

На стороне ios я реализовал userContentController через

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { 
  if message.name == "isLocationPresent" {
// my logic for checking if location service is available
// if location is present the method returns true else false
  let isGpsAvailable:Bool = self.checkLocationServiceState()
        if isGpsAvailable {
            webView.evaluateJavaScript("sendComment(\(isGpsAvailable ))", completionHandler: {(result,error) in
                print(result)
                print(error)
            })
        }
      else{
           // perform other logic there 
         } 
     }
}

Javascript

 document.getElementById('click').onclick = function() {
    window.webkit.messageHandlers.isLocationPresent.postMessage("checkLocation").
}

function sendComment(aval) {
if(aval) {
  makeRequest()
}
else {
// logic to handle if false
}
}

Но каждый раз, когда я нажимаю кнопку, valuJavascript всегда выдает ошибку ссылки Javascript: переменная sendComment не найдена.

Веб-приложение является динамическим, каждый HTML-элемент создается javascript. У меня есть три вида, когда пользователь нажимает на список, он переходит ко второму виду, где отображается кнопка click.

Итак, вызов веб-просмотра при загрузке страницы не будет работать, потому что элемент кнопки не отображается в моем первом представлении

Функция sendComment () должна вызываться ios только при нажатии кнопки на веб-интерфейсе. У меня есть и другие случаи использования, когда вызов функции должен выполняться в ios, когда пользователь выполняет действие только во внешнем интерфейсе.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Я наконец решил проблему

Проблема

Я реализовывал свою конфигурацию и контроллер в view.didLoad() func.

Решение

Добавьте все настройки, настройки и userContentController в loadView() func и загрузите веб-просмотр либо по конечной точке https, либо по локальному html-файлу в viewDidLoad() func


Просмотр нагрузки

override func loadView() {
    super.loadView()

    let preferences = WKPreferences()
    preferences.javaScriptEnabled = true

    let configuration = WKWebViewConfiguration()
    configuration.preferences = preferences

    let userContentController = WKUserContentController()

    userContentController.add(self,name:"sendComment")

    configuration.userContentController = userContentController



    self.view.addSubview(webView)
    self.view.sendSubviewToBack(webView)

    webView = WKWebView(frame: view.bounds, configuration: configuration)

    view = webView
}

Просмотр загружен

Вот мой override func viewDidLoad()

override func viewDidLoad() {
        super.viewDidLoad()
        print("view will load")
        // Do any additional setup after loading the view, typically from a nib.

        let request = URLRequest(url:URL(string:"your-url")!)
        webView.navigationDelegate = self

        webView.load(request)
    }

userContentController

Мой userContentController для получения сообщений JS внутри класса viewController

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
            print(message.name)
            if message.name == "sendComment" {
              let result:String = "Marlboro"

                webView.evaluateJavascript("sendComment('\(result)')", completionHandler:{(result , error) in
            if error == nil {
               print("success")
            } 
           else {
             print("error in executing js ", error)
            }
     })
   }
}
0 голосов
/ 02 ноября 2018

Используйте этот код для вызова js функции в Objectiv-C

 NSString * scriptSource = [NSString stringWithFormat:@"sendComment(%@)",msg];
[_WebView evaluateJavaScript:scriptSource completionHandler:^(NSString *result, NSError *error)
 {
     if(result != nil){
         NSLog(@"Result: %@",result);
     }

 }];

Swift

var scriptSource = "sendComment(\(msg))"
webView.evaluateJavaScript(scriptSource) { (result, error) in
    if result != nil {
        print(result)
    }
}
...