Try   HackMD

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)