做App內嵌H5項目時,經常會遇到js與App的交互,最普遍的就是方法的互相調用,那么如何實現方法的互相調用呢?
寫在前面:
如果只是小項目且后期擴大的可能性不大的時候,可以忽略,可如果是長期項目的話,那么就需要考慮以下一些問題了。
1. 方法命名規范。
如果考慮到以后會有大量的方法,那么規范化的命名就很重要了,規范化的命名,既保證了名字的唯一性又保證了代碼的可讀性方便開發過程,也方便后期維護。
舉個栗子, 如果現在有一個方法,是關閉webview, js調用app的方法, 如果直接叫closePage, 那么根本看不出來是要調用App的方法,混亂且有可能被其他命名覆蓋,那么如果叫 JAMS__closePage ,即所有的js 與App的交互的方法都加 JAMS 那么就很容易分辨了,且不易重名。
2.安全性。
如果在你的App內能打開其他的網頁鏈接,那么這些接口的安全性也是需要考慮的,即保證在指定的webview或者授權的webview內這些方法才能被調用,這點很重要。
第一種方法是app內判斷webview地址來源,來匹配對用方法的使用權,顯然這個每次添加新頁及方法的時候,App都需要修改授權列表。
第二種方法是,App打開webview的時候,如果是自己的業務H5那么調用的時候可以傳入一個token,每次調用方法時都校驗token。
一, js調用App 方法
假設方法名為 JAMS__mark
android 系統:
然后可以封裝一下 像這樣
export function JAMS__mark() { if (/android/i.test(navigator.userAgent)) { try { window.android.JAMS__mark(params) } catch (e) { console.log(e) } } else if (/ios|iphone|ipod|pad/i.test(navigator.userAgent)) { try { window.webkit.messageHandlers.JAMS__mark.postMessage(params) } catch (e) { console.log(e) } } }
二、 App調用js方法
App調用js 方法需要js將方法掛載在window下,這樣App才能調用到方法,
假設方法名叫 JAMS__success
window.JAMS__success = function () {
// do some thing
// if need some params ,you can alse return it
return params;
}
需要主要的是如果需要返回一些數據給App,那么這些數據不能夠通過異步來獲取,也不能夠有阻斷進程的語句如alert,否者,app將不能夠獲取到正確參數,而是得到 undefined, 例如在方法里加個alert('1'), 而 return 在 alert語句后。
(完)