Android/iOS 功能交互
Android 在加載 H5 頁面的時候,需要向 WebView 里面注入一個 _JHAPP 對象,并且該對象提供一個可供 JS 調(diào)用的 api 方法;
iOS 在加載 H5 頁面的時候,因為蘋果不支持對象注入,所以里面是注入一個 ** _JHAPP** 方法,并且該方法也可供 JS 調(diào)用。
但是 Android 和 iOS 與 JS 交互的機(jī)制是不一樣的,所以還需要制定一下統(tǒng)一的交互規(guī)則,方便 JS 進(jìn)行方法調(diào)用。
Android 端調(diào)用可以直接拿到調(diào)用返回值:
let result = window._jh.api(); // 無參數(shù) API 調(diào)用
let result = window._jh.api('eyJuYW1lIjogInRpdGxlIn0='); // 有參數(shù) API 調(diào)用
參數(shù)解析格式:
{
RequestId : "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d", // 唯一調(diào)用標(biāo)識
MethodName : "getPlatformName", // 調(diào)用方法名稱
Params : null | {}, // 要調(diào)用方法的參數(shù)
}
- RequestId : 此標(biāo)識能夠代表 JS 的唯一請求,如果是異步方法調(diào)用,可以在異步方法完成后回調(diào)該標(biāo)識;
- MethodName : 要調(diào)用的方法名稱,請參照接口文檔進(jìn)行實現(xiàn);
- Params : 要調(diào)用的方法的參數(shù),可以為 Null 或者是一個 Object 類型,為 Null 代表沒有參數(shù),反之則 Object 中的每一個 Key 代表一個參數(shù)項;
- 同步返回 : Android 可以直接在方法里面返回函數(shù)調(diào)用結(jié)果,但是請也必須對返回數(shù)據(jù)進(jìn)行 Base64 編碼之后再返回;
- 異步返回 : 有些方法需要異步返回結(jié)果,可以在方法執(zhí)行結(jié)束之后,把返回結(jié)果 Base64 編碼之后直接調(diào)用 JS 的 notify 方法。
hybrid.notify("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d", "eyJuYW1lIjogInRpdGxlIn0=");
iOS 端調(diào)用不能直接拿到調(diào)用返回值:
window.webkit.messageHandlers._jh.postMessage('eyJuYW1lIjogInRpdGxlIn0=');
{
RequestId : "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d", // 唯一調(diào)用標(biāo)識
MethodName : "getPlatformName", // 調(diào)用方法名稱
Params : null | {}, // 要調(diào)用方法的參數(shù)
}
- RequestId : 此標(biāo)識能夠代表 JS 的唯一請求,如果是異步方法調(diào)用,可以在異步方法完成后回調(diào)該標(biāo)識;
- MethodName : 要調(diào)用的方法名稱,請參照接口文檔進(jìn)行實現(xiàn);
- Params : 要調(diào)用的方法的參數(shù),可以為 Null 或者是一個 Object 類型,為 Null 代表沒有參數(shù),反之則 Object 中的每一個 Key 代表一個參數(shù)項;
- 異步返回 : iOS 不能同步返回調(diào)用結(jié)果,但是可以在方法執(zhí)行結(jié)束之后,把返回結(jié)果以 Base64 編碼之后直接調(diào)用 JS 的 notify 方法。
hybrid.notify("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d", "eyJuYW1lIjogInRpdGxlIn0=");
交互消息通知
在很多 App 場景下,H5 頁面在運(yùn)行過程中也需要根據(jù)系統(tǒng)運(yùn)行狀態(tài)及時的發(fā)生改變,但是 H5 沒有后臺運(yùn)行的能力,這會導(dǎo)致在有些業(yè)務(wù)流程中,跳轉(zhuǎn)到了原生界面進(jìn)行信息采集,但是采集之后的信息需要在不刷新 H5 頁面的情況下返回給 H5 界面進(jìn)行顯示,這時候就需要 Android/iOS 原生客戶端具備能夠及時通知 JS 更新內(nèi)容的能力。
為了解決這個問題,JS 向原生客戶端公開如下方法調(diào)用,共接收兩個參數(shù):
hybrid.notify(event/* string */, params/* string */);
- event 代表事件名稱,可查閱事件通知文檔,了解事件名稱的含義與攜帶的參數(shù)列表。
- params 代表事件攜帶的參數(shù),這是一個經(jīng)過 Base64 編碼之后的字符串,前段開發(fā)者可查閱事件通知文檔,了解具體的使用方法。
如果客戶端想要主動通知 H5 更新頁面的話,可以隨時調(diào)用 JS 的 jh.notify 方法,并把要投遞的消息參數(shù)給編碼好即可,由 JS 自行決定消息應(yīng)該怎么處理。