天天看點

iOS 混合應用的關鍵點分析 - 仿 Android 平台 WebView 可注入本地對象方法的功能實作要點

iOS 混合應用的關鍵點分析 - 仿 Android 平台 WebView 可注入本地對象方法的功能實作要點

<a target="_blank" href="http://blog.csdn.net/opengl_es">轉載請保留此句:太陽火神的美麗人生 -  本部落格專注于 靈活開發及移動和物聯裝置研究:iOS、Android、Html5、Arduino、pcDuino,否則,出自本部落格的文章拒絕轉載或再轉載,謝謝合作。</a>

對于 iOS 和 Android 平台來說,各自的流暢覽器元件 UIWebView 和 WebView 都可以很容易地在本地代碼中調用 WebView 内頁面 JS 腳本。

然後,從 JS 調用本地方法,隻有 Android 平台的 WebView 元件提供了,這也很容易了解,畢竟 Android WebView 元件以 Java 實作,想向其反射注入些功能也時很容易的,但具體實作尚未去分析源碼證明。

對于 iOS 來說,隻有一個切入點,那就是通過 UIWebViewDelegate 的頁面加載事件,獲得到頁面内的加載事件。

那麼如何在頁面内很容易地觸發一個頁面加載事件,以便能在本地代理方法中截獲并響應這一 HTML 頁面内事件呢?

這一問題,即已抽象出了函數調用方的事件觸發,和函數被調方的事件響應機制的映射雙方。

1、通過 a 标簽,早些年的 PhoneGap 架構即為這樣實作的,不過感覺有些拘束;

2、加入 input 元件,并設定為隐藏狀态,通過設定其 onClick 事件,動态更新其加載的連結,這個對原頁面有要求,且附屬操作過多;

3、像 img 的頁面二次加載其 src 指定圖檔的原理,即不會影響原頁面産生重新整理,又會觸發頁面加載;

    實際測試發現,該元件隻在頁面初次加載時,進行串行加載,即使加了 defer 或 async 參數,也無法動态觸發。

    後發現一個開源庫,其采用了 iframe 的 src 來觸發加載,動态将 iframe 添加到頁面,就會觸發加載 src 連結的事件,能被本地捕獲,然後馬上再移除這個 iframe。

這個開源庫能很好地将 iOS 本地對象的所有方法動态加載給目前頁面的 window 對象,可以在頁面内直接調用對應對象的方法。

不過該庫實作者對 iOS 方法簽名的了解有誤,是以,對于多參數方法,并沒有能很好地解決。