WebViewJsBridge-iOS 做一個(gè)好用的橋接庫(kù)

移動(dòng)技術(shù)發(fā)展了七八年毁涉,開(kāi)發(fā)人員永遠(yuǎn)有個(gè)跨平臺(tái)的夢(mèng)饼齿。從最開(kāi)始的 Web App 被人詬病體驗(yàn)差买乃,ReactNative姻氨,Weex 等技術(shù)又有很多難以平復(fù)的坑,包括現(xiàn)在的 Flutter 也有很多問(wèn)題待解決剪验,跨平臺(tái)的夢(mèng)想很美好肴焊,現(xiàn)實(shí)卻總有這樣那樣的瑕疵前联。移動(dòng)開(kāi)發(fā)發(fā)展到今天,我認(rèn)為最好的跨平臺(tái)技術(shù)還是 H5 + Native 的混合開(kāi)發(fā)模式抖韩。隨著前端技術(shù)的飛速發(fā)展蛀恩,如今可以依靠各種技術(shù)和工具對(duì)前端進(jìn)行優(yōu)化,使其在移動(dòng)端的體驗(yàn)更接近原生水平茂浮。

我們?cè)谧龌旌祥_(kāi)發(fā)(Hybrid App)時(shí)双谆,絕對(duì)繞不開(kāi) JavaScript 與 Native(iOS & Android)之間的交互問(wèn)題。現(xiàn)在主流的交互框架有 WebViewJavascriptBridge席揽,它可能是最早的 iOS 與 JavaScript 橋接庫(kù)顽馋,該庫(kù)優(yōu)點(diǎn)是接口簡(jiǎn)單好用,不用往 HTML 中引入額外的 js 文件幌羞,缺點(diǎn)是只支持 iOS寸谜,同一個(gè)項(xiàng)目還要為 Android 尋找一個(gè)對(duì)應(yīng)的橋接庫(kù),另一個(gè)問(wèn)題是對(duì)交互接口沒(méi)有管理属桦,大多數(shù)情況下我們把接口都寫到一個(gè) Controller 中的熊痴,造成代碼堆積,接口不易維護(hù)聂宾。近幾年還有一個(gè)比較好的橋接庫(kù)是 DSBridge-IOS果善,這個(gè)庫(kù)相比 WebViewJavascriptBridge 的優(yōu)勢(shì)是支持 iOS 與 Android,接口支持以類的方式管理系谐,但是使用時(shí)需要往 HTML 中引入一個(gè) js 文件巾陕,3.0 新版本只支持 WKWebView,其實(shí)現(xiàn)方式是繼承了 WKWebView纪他,所以使用時(shí)要使用其改造后的 DWKWebView鄙煤,我本人不喜歡這種對(duì) WebView 的侵入方式。

我在其兩個(gè)庫(kù)的基礎(chǔ)之上又造了一個(gè)輪子茶袒,這就是 WebViewJsBridge-iOS梯刚,它首先支持 iOS 與 Android 兩個(gè)端,接口與 WebViewJavascriptBridge 基本一樣薪寓,同樣支持以類的方式管理交互接口乾巧,同樣需要引入一個(gè) js 文件(在 1.1.0 版本中可以不引用這個(gè) js 文件),同時(shí)支持 UIWebView 和 WKWebView预愤,沒(méi)有用繼承 WebView 這種侵入方式實(shí)現(xiàn)功能。

以下是 WebViewJsBridge-iOS 的使用文檔供大家參考:

WebViewJsBridge-iOS

WebViewJsBridge-iOS 是 HTML5 和 UIWebView & WKWebView 之間用于通訊的工具庫(kù)咳胃。

WebViewJsBridge-Android:https://github.com/al-liu/WebViewJsBridge-Android

它的特點(diǎn)是跨平臺(tái)植康,支持 iOS,Android展懈,JavaScript销睁,接口統(tǒng)一供璧,簡(jiǎn)單易用。工具庫(kù)的實(shí)現(xiàn)對(duì) WebView 無(wú)侵入性冻记。使用以類的方式來(lái)管理通信的接口睡毒,每個(gè)接口的實(shí)現(xiàn)類對(duì)應(yīng)唯一的命名空間,如 ui.alert冗栗,ui 對(duì)應(yīng)一個(gè)實(shí)現(xiàn)類的命名空間演顾,alert 是該實(shí)現(xiàn)類的一個(gè)實(shí)現(xiàn)方法。在 1.1.0 版本中隅居, H5 可以不引入 hcJsBridge.js 文件钠至。

下面這張圖幫助理解它們之間的關(guān)系:

WebViewJsBridge-namespace.png

系統(tǒng)版本要求

如果使用 UIWebView 則支持 iOS7 及以上的系統(tǒng)版本。
如果使用 WKWebView 則支持 iOS8 及以上的系統(tǒng)版本胎源。

安裝

CocoaPods

CocoaPods 是 Cocoa 項(xiàng)目的依賴管理器棉钧,使用方法和安裝步驟請(qǐng)參考 CocoaPods 的官網(wǎng)。使用 CocoaPods 整合 WebViewJsBridge-iOS 到你的項(xiàng)目中涕蚤,需要指定如下內(nèi)容到你的 Podfile 文件:

platform :ios, '8.0'

target 'TargetName' do
  pod 'HCWebViewJsBridge', '~> 1.1.0'
end

然后宪卿,運(yùn)行如下命令:

$ pod install

手動(dòng)安裝

下載 HCWebViewJsBridge 的源代碼,并添加到自己的項(xiàng)目中即可使用万栅。

引入 HCWebViewJsBridge 的 js 文件

在 html 文件中 <script>引入 hcJsBridge.js</script>佑钾。

注意: 1.1.0 版本 H5 可以不引入 hcJsBridge.js 文件,但使用方法有少許差異申钩,后面有介紹次绘。

Example 的說(shuō)明

/Example/iOS Example 文件夾下提供完整使用示例,包括基礎(chǔ)的調(diào)用演示和進(jìn)階用法撒遣,如邮偎,使用 UIImagePickerController 調(diào)用相機(jī)拍攝一張圖片,使用 NSURLSession 發(fā)起一個(gè) GET 請(qǐng)求义黎。

使用方法

初始化原生的 WebViewJsBridge 環(huán)境

UIWebView

如果 H5 引入 hcJsBridge.js禾进,則使用下面這個(gè)初始化方法。

_bridge = [HCWebViewJsBridge bridgeWithWebView:self.webView];

如果 H5 不引入 hcJsBridge.js廉涕,則使用下面這個(gè)初始化方法泻云。

_bridge = [HCWebViewJsBridge bridgeWithWebView:self.webView injectJS:YES];

WKWebView

如果 H5 引入 hcJsBridge.js,則使用下面這個(gè)初始化方法狐蜕。

_bridge = [HCWKWebViewJsBridge bridgeWithWebView:self.wkWebView];

如果 H5 不引入 hcJsBridge.js宠纯,則使用下面這個(gè)初始化方法。

_bridge = [HCWKWebViewJsBridge bridgeWithWebView:self.wkWebView injectJS:YES];

原生注冊(cè)接口實(shí)現(xiàn)類供 HTML5 調(diào)用

UIJsApi *uiApi = [UIJsApi new];
[_bridge addJsBridgeApiObject:uiApi namespace:@"ui"];

RequestJsApi *requestJsApi = [RequestJsApi new];
[_bridge addJsBridgeApiObject:requestJsApi namespace:@"request"];

UIJsApi 實(shí)現(xiàn)類:

- (void)alert:(NSDictionary *)data callback:(HCJBResponseCallback)callback {
    callback(@"native api alert’callback.");
}
// 接口實(shí)現(xiàn)類支持四種方法簽名:
// 1. 有參數(shù)层释,有回調(diào)
- (void)test1:(NSString *)data callback:(HCJBResponseCallback)callback {
    NSLog(@"Js call native api test1, data is:%@", data);
    callback(@"native api test1’callback.(備注:漢字測(cè)試)");
}
// 2. 有參數(shù)婆瓜,無(wú)回調(diào)
- (void)test2:(NSDictionary *)data {
    NSLog(@"Js native api:test2, data is:%@", data);
}
// 3. 無(wú)參數(shù),無(wú)回調(diào)
- (void)test3 {
    NSLog(@"Js native api:test3");
}
// 4. 無(wú)參數(shù),有回調(diào)
- (void)test4:(HCJBResponseCallback)callback {
    NSLog(@"Js native api:test4");
    callback(@"native api test4'callback.(備注:漢字測(cè)試)");
}

原生調(diào)用 HTML5 接口

[_bridge callHandler:@"testCallJs" data:@{@"foo": @"bar"} responseCallback:^(id  _Nonnull responseData) {
    NSLog(@"testCallJs callback data is:%@", responseData);
}];

初始化 HTML5 的 WebViewJsBridge 環(huán)境

如果 H5 引入 hcJsBridge.js廉白,則使用下面的方式引入个初。

<!DOCTYPE html>
<html>
    <head>
        ...
        <script src="./hcJsBridge.js"> </script>
    </head>
    ...
</html>

如果 H5 不引入 hcJsBridge.js,則使用下面這個(gè)方法注冊(cè)接口猴蹂。

// 在這個(gè) window._hcJsBridgeInitFinished 全局函數(shù)中等待 bridge 初始化完成院溺,然后注冊(cè)接口,初始調(diào)用磅轻。
window._hcJsBridgeInitFinished = function(bridge) {
    bridge.registerHandler("test1", function(data, callback) {
        callback('callback native,handlename is test1');
    })
    
    bridge.callHandler('ui.test3');
}

HTML5 注冊(cè)接口供原生調(diào)用

hcJsBridge.registerHandler("testCallJs", function(data, callback) {
    log('Native call js ,handlename is testCallJs, data is:', data);
    callback('callback native, handlename is testCallJs');
})

HTML5 調(diào)用原生接口

var data = {foo: "bar"};
hcJsBridge.callHandler('ui.alert', data, function (responseData) {
    log('Js receives the response data returned by native, response data is', responseData);
})

開(kāi)啟 debug 日志

開(kāi)啟 debug 日志珍逸,將打印一些調(diào)用信息,輔助排查問(wèn)題瓢省。debug 日志默認(rèn)不開(kāi)啟弄息,release 模式下屏蔽 debug 日志,但不屏蔽 error 日志勤婚。

[_bridge enableDebugLogging:YES];

License

WebViewJsBridge-iOS 使用 MIT license 發(fā)布摹量,查看 LICENSE 詳情。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末馒胆,一起剝皮案震驚了整個(gè)濱河市缨称,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祝迂,老刑警劉巖睦尽,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異型雳,居然都是意外死亡当凡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門纠俭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)沿量,“玉大人,你說(shuō)我怎么就攤上這事冤荆∑釉颍” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵钓简,是天一觀的道長(zhǎng)乌妒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)外邓,這世上最難降的妖魔是什么撤蚊? 我笑而不...
    開(kāi)封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮损话,結(jié)果婚禮上拴魄,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好匹中,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著豪诲,像睡著了一般顶捷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屎篱,一...
    開(kāi)封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天服赎,我揣著相機(jī)與錄音,去河邊找鬼交播。 笑死重虑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秦士。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼衔统!你這毒婦竟也來(lái)了藕甩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤曹傀,失蹤者是張志新(化名)和其女友劉穎辐脖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體皆愉,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗜价,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幕庐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片久锥。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖翔脱,靈堂內(nèi)的尸體忽然破棺而出奴拦,到底是詐尸還是另有隱情,我是刑警寧澤届吁,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布错妖,位于F島的核電站,受9級(jí)特大地震影響疚沐,放射性物質(zhì)發(fā)生泄漏暂氯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一亮蛔、第九天 我趴在偏房一處隱蔽的房頂上張望痴施。 院中可真熱鬧,春花似錦、人聲如沸辣吃。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)神得。三九已至厘惦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哩簿,已是汗流浹背宵蕉。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留节榜,地道東北人羡玛。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宗苍,于是被迫代替她去往敵國(guó)和親稼稿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,097評(píng)論 1 32
  • 首先去騰訊地圖配置 小程序?qū)?yīng)的keyhttps://lbs.qq.com/console/mykey.html并...
    粥的進(jìn)擊之旅閱讀 1,481評(píng)論 0 4
  • 一直都想再去重溫那個(gè)場(chǎng)景浓若,那天是一個(gè)很普通很平常的一天渺杉,像已往一樣在別人埋頭寫卷時(shí)扭頭向窗外探望,遠(yuǎn)方的天空伴著火...
    阿金有四金啊閱讀 95評(píng)論 0 1
  • 商店搜 beautify 挪钓; 使用方法: f1 -- beautify --- 選擇你要格式化的文件 是越,, --
    nuin閱讀 467評(píng)論 0 0
  • 徐行20190507 今天下班以后碌上,開(kāi)車趕往工作令倚评,去合作伙伴那講課。公主嶺這個(gè)名字聽(tīng)起來(lái)已經(jīng)有很多...
    徐行我看行閱讀 2,597評(píng)論 0 2