AndroidとiOSでアプリを作成する必要があって、ちょっと複雑な画面を実装する時にそこだけHTMLで作成できると良いときがあります。
(見た目部分はCSSが得意なデザインチームにお願いもできるし)
iOSでHTMLを表示してデータを渡す方法が進化していたので、まとめておきます。
## 方法
WKWebViewを使って、JavaScriptをCallして値(JSON)をHTML側に渡します。
JavaScriptはこんな感じで情報を受け取る関数を用意しておきます。
```javascript
`gutter:true;
function test(val) {
const jsonObj = JSON.parse(val);
var h1 = document.getElementById("title");
h1.textContent = jsonObj.title;
webkit.messageHandlers.callbackHandler.postMessage(val);
}
```
Swiftからはtest関数をこんな感じでCallします。
```c
`gutter:true;
extension ViewController : WKNavigationDelegate {
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
// Javascriptに渡す値
let param: String = "{\"title\": \"Hello World!\"}"
// Javascript側で実行する関数
let execJsFunc: String = "test(JSON.stringify(\(param)));"
webView.evaluateJavaScript(execJsFunc, completionHandler: { (object, error) -> Void in
// jsの関数実行結果
// js側で戻り値を返すこともできる
})
}
}
```
注意するのは、JavaScriptをCallするのはHTMLの読み込みが終わってから行うということです。
サンプルコードではdidFinishのデリゲートをトリガーに実行しています。
### その他
以前はURLの読み込みとか、リンクをDelegateで受けて処理をねじ込む必要があったと記憶していますがJavaScriptの関数を直接Callできるようになっていて簡単になりました。
Androidは昔からJavaScriptを呼び出せるようになっていたので、足並みが揃いました。
(iOSはWKWebViewになったあたりでできるようになったのかな?)
### 参考URL
* [Qiitaの投稿](https://qiita.com/takutoki/items/166204807ee48cd7dd59)
* [今回のサンプルコード](https://github.com/k28/ios-sample/tree/master/WKWebViewSample)
0 件のコメント :
コメントを投稿