# FrontEnd 與 Native 的串接
## Native 啟動 Webview 的時候,需要加上 User Agent 的後綴
```
"/XXX_APP" --> XXX APP
```
iOS User-Agent 加後綴
```
fileprivate func setNavigatorUserAgent() {
// 由native的webview在user agent加上特定字串,方便web辨別是否為mRich app
self.tempWebView.evaluateJavaScript("navigator.userAgent") { [weak self] (result, error) in
if let userAgent = result as? String {
self?.webView.customUserAgent = userAgent + "/ON_MRICH_APP"
}
}
}
```
android User-Agent 加後綴
```
class WebViewSettings {
companion object SETTING {
fun initWebView(context : Activity? , webview : WebView?) {
// 加mobile物件
webview?.addJavascriptInterface(WebAppInterface(context), "mobile")
// User-Agent 加後綴
val webSettings = webview?.getSettings()
val userAgentStr = webSettings?.getUserAgentString()
webSettings?.setUserAgentString(userAgentStr + "/ON_MRICH_APP")
...
}
}
}
```
## FrontEnd Call Native
### Request Sample
```
{
tag:'XXXXX',
uuid: '20d8e5fe-d9bc-11e9-8a34-2a2ae2dbcce4',
requestData:{...} or {}
}
```
以上JSON物件會轉成JSONSTRING => message,使用postMessage呼叫Native
#### postMessage()
##### iOS Request
* 寫在Web端的呼叫iOS的語法
```
window.webkit.messageHandlers.mobile.postMessage(message);
```
* iOS使用以下方式串接
```
extension ViewController: WKScriptMessageHandler {
func userContentController(
_userContentController: WKUserContentController,
didReceive message: WKScriptMessage
){
let name = message.name
if name == "mobile" {
...
}
}
}
```
##### android Request
* 寫在Web端的呼叫android語法
```
window.mobile.postMessage(message);
```
* android使用以下方式串接
```
@JavascriptInterface
fun postMessage(param : String) : String? {
…
}
```
## Native Callbakc to FrontEnd
### Response Sample
```
{
tag: 'XXXX'
uuid: '0d8e5fe-d9bc-11e9-8a34-2a2ae2dbcce4'(與request帶的uuid相同)
returnCode: '...'
returnMsg: 'xxx'
returnData: {...} or {}
}
```
以上JSON物件要轉成JSONSTRING => message
Native要執行FrontEnd的JS callback Method
```
window.executeAsync(message)
```