Как вызвать функцию swift из TypeScript - PullRequest
2 голосов
/ 05 марта 2020

Я пишу функцию по нажатию кнопки в моем файле TypeScript.

<button (click)="invokeMessage()">Submit</button>

invokeMessage() {
  const text = 'Hello iOS!';
  this.swiftMethod(text);
}

swiftMethod(text: string) { }

Мне нужно вызвать эту функцию "swiftMethod ()" в swift. Но не получая обратного вызова при использовании вышеуказанного кода.

Однако я могу добиться этого с помощью JavaScript:

<html>
    <title>
        my title
    </title>
    <head>
        <script>
            function invokeMessage() {
                var inputName = document.getElementById('name').value
                swiftMethod(inputName)
            }    
        </script>
    </head>
    <body>
        <button onclick='invokeMessage()'>Submit</button>
        <input type='text' name='firstname' id='name' value='Jamie'><br>
    </body>
</html>

Swift Code:

extension ViewController: UIWebViewDelegate {

  func webViewDidFinishLoad(_ webView: UIWebView) {

    print("text")        

    let ctx = webView.value(forKeyPath: "documentView.webView.mainFrame.javaScriptContext") as! JSContext        

    let swiftMethod: @convention(block) (String) -> () = { email in

      print("Got Callback email = \(email) ")

    }        

    ctx.setObject(unsafeBitCast(swiftMethod, to: AnyObject.self), forKeyedSubscript: "swiftMethod" as (NSCopying & NSObjectProtocol)?)

  }

}

Как написать мою функцию в TypeScript?

1 Ответ

0 голосов
/ 06 марта 2020

Рад получить несколько полезных постов / ссылок, которые помогут мне ответить на мой вопрос.

После iOS 8 Apple рекомендует использовать WKWebView над UIWebView (я использую UIWebView выше).

Я получил этот пост, который объясняет, как возможна связь между iOS / Android и JavaScript.

Также получил это тот, который объясняет, как соединить JavaScript и WKWebView по-разному.

Наконец, о моем коде, взяв ссылку сверху, я написал следующую функцию TypeScript:

<button (click)="invokeMessage()">Submit</button>

invokeMessage() {
  try {
      (window as any).webkit.messageHandlers.callbackHandler.postMessage('testValue');
    } catch (error) {
        console.log(error);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...