記一則iOS封裝SDK的開發過程之WebView與JS的互動

weixin_33866037發表於2018-05-25

問題 :不顯式顯示或載入WebView,內部部分內容好像執行不及時。

  近來接觸了一個封裝sdk的專案,過程中遇到了一些問題,現在空了下來,將這個過程記錄一下。
專案主要由<u>iOS封裝一個framework靜態庫,庫裡面引入由甲方提供的js方法庫(一個js檔案),原生呼叫js中的方法,將方法返回值通過原生方法回撥會去</u>。相當於一箇中介軟體的功能。

  我首先想到的是通過 UIWebViewWKWebView 來載入js,然後通過javascriptCore和WKWebView自帶的方法來處理。這個甲方要求又不要顯示html頁面,所以使用WebView有點用了牛刀的感覺。查了查資料,沒有找到直接能和js檔案互動的方法,無奈還是採用了WKWebView。

  由於wkwebView是iOS8以後推出的新框架,故而一開始就使用使用了wkwebview。當對應的html、js到位後,發現js中的回撥很奇怪,原生偶爾可以得到回撥,猜測可能js方法庫中方法太過繁忙,從而導致訊息堵塞進而丟失掉。經過延時的操作,發現並不是這個問題。

  正如之前說的,專案並不需要展示webView,html中的內容也不需要展示。而需求是提供.framework,不可能標頭檔案提供一個webView給開發者,新增到對應的介面上吧。因此做了一個小嚐試,快速改換成了UIWebView,相應的js方法,和呼叫方法,以及回撥方法改了下來測試。發現可以正常使用。這下得出結論WkWebView如果沒有正常顯示的話,內部有種“惰性”的感覺,某些js方法執行和回撥很“遲緩”,往往點幾次才會響應。

  研究到這,應該是換成UIWebView了。但是抱著不甘心,多查了些資料,和試驗了幾波,是真的因為那個原因嗎?不多說了,總結了下我的兩個解決方法:

最終解決

1.使用UIWebView

js中使用下面的程式碼回撥原生

bclMiddlecallback(callbackScheme, callbackPath); 

UIWebView可以不加在任何View上,也可以設定.hidden = YES;

2.繼續使用WKWebView

js中使用下面的方法回撥原生

 window.webkit.messageHandlers.bclMiddlecallback.postMessage(callbackScheme + callbackPath); 

!!!WKWebView必須加在某個View上,內部一些機制才能正常運轉、回撥才能正常發生。.hidden設定或者不設定不影響。

所以:

WKWebView *wkWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, [[UIScreen mainScreen] bounds].size.height, 320, 480) configuration:configuration];
_wkWebView = wkWebView;
[[[UIApplication sharedApplication] windows].firstObject addSubview:wkWebView];
wkWebView.hidden = YES;

收工!


如果你也遇到此問題,如果你有新的想法請聯絡我:dongigndao@163.com

相關文章