記一則iOS封裝SDK的開發過程之WebView與JS的互動
問題 :不顯式顯示或載入WebView,內部部分內容好像執行不及時。
近來接觸了一個封裝sdk的專案,過程中遇到了一些問題,現在空了下來,將這個過程記錄一下。
專案主要由<u>iOS封裝一個framework靜態庫,庫裡面引入由甲方提供的js方法庫(一個js檔案),原生呼叫js中的方法,將方法返回值通過原生方法回撥會去</u>。相當於一箇中介軟體的功能。
我首先想到的是通過 UIWebView 或 WKWebView 來載入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
相關文章
- WKWebView和WebView與JS的互動方式WebViewJS
- Android webview 與 js(Vue) 互動AndroidWebViewJSVue
- WebView與JS的互動,以及注意事項WebViewJS
- Android webview JS 互動AndroidWebViewJS
- JockeyJS——優秀的WebView與JS互動開源庫使用和解析JSWebView
- Flutter WebView與JS互動簡易指南FlutterWebViewJS
- Cordova-iOS SDK封裝iOS封裝
- WebView和js的互調WebViewJS
- WebView與APP互動實戰記錄WebViewAPP
- iOS BLE 開發小記[5] 與 Remote Peripheral 互動的最佳實踐iOSREM
- iOS高階-WebView & JavaScript互動(附DEMO)iOSWebViewJavaScript
- ReactNative與iOS的互動ReactiOS
- Android WebView:這是一份 詳細 & 易懂的WebView學習攻略(含與JS互動、快取構建等)AndroidWebViewJS快取
- flutter webView 使用以及與 js 互操作FlutterWebViewJS
- Android與WebView資料互動AndroidWebView
- Flutter使用JsBridge與WebView互動FlutterJSWebView
- 開發時候常用的js方法封裝JS封裝
- iOS與JS互動之UIWebView-JavaScriptCore框架iOSJSUIWebViewJavaScript框架
- iOS與JS互動之UIWebView協議攔截iOSJSUIWebView協議
- 封裝一個自己的js庫封裝JS
- request sdk 封裝封裝
- 基於 Agora SDK 實現 iOS 端的多人視訊互動GoiOS
- js 與WKWebView 互動JSWebView
- 微信小程式API互動的自定義封裝微信小程式API封裝
- 使用 WebView2 封裝一個生成 PDF 的 WPF 控制元件WebView封裝控制元件
- iOS開發筆記之Xcode9.2下SDK開發-生成Framework的圖解流程iOS筆記XCodeFramework圖解
- 玩轉iOS開發:iOS開發中的裝逼技術 – RunTime(一)iOS
- 封裝與職責分離的開發思維封裝
- 前端ui自動化測試sdk封裝前端UI封裝
- Solana 開發學習之透過RPC與Solana互動RPC
- flash如何與js互動?JS
- 封裝一個postMessage庫,進行iframe跨域互動封裝跨域
- "MPlayer+TextureView" : 封裝一個視訊播放器的 "SDK"View封裝播放器
- Java 封裝 SDK 以及使用Java封裝
- 8.7 一個模組的封裝過程封裝
- iOS多級選擇框架封裝與專案中的一些坑iOS框架封裝
- iOS開發 webview禁止視訊全屏播放iOSWebView
- 封裝scroll.js 獲取滾動條的值封裝JS