iOS與JS交互

簡述:

隨著h5開發(fā)需求量的逐漸增多欧聘,如何才能更好地在原生上實(shí)現(xiàn)h5界面開發(fā),讓app不僅擁有原生的體驗(yàn)感胧奔,還能保證h5的界面靈活性嘀粱,現(xiàn)提供一套實(shí)用的iOS與原生的交互代碼,親測(cè)可用,歡迎大家指導(dǎo)建議。

首先采用的框架是WebViewJavascriptBridge,采用這套框架可以方便的使iOS與JS交互

一.?流程圖(主要介紹思路)

二.iOS端如何使用

首先導(dǎo)入#import"WebViewJavascriptBridge.h"文件

第一步:開啟日志


//?開啟日志态贤,方便調(diào)試

[WebViewJavascriptBridge enableLogging];


第二步:給ObjC與JS建立橋梁


//?給哪個(gè)webview建立JS與OjbC的溝通橋梁

self.bridge = [WebViewJavascriptBridgebridgeForWebView:webView];


//?設(shè)置代理,如果不需要實(shí)現(xiàn)醋火,可以不設(shè)置

[self.bridge setWebViewDelegate:self];


第三步:注冊(cè)HandleName抵卫,用于給JS端調(diào)用iOS端


// JS主動(dòng)調(diào)用OjbC的方法

//?這是JS會(huì)調(diào)用getUserIdFromObjC方法,這是OC注冊(cè)給JS調(diào)用的

// JS需要回調(diào)胎撇,當(dāng)然JS也可以傳參數(shù)過來介粘。data就是JS所傳的參數(shù),不一定需要傳

// OC端通過responseCallback回調(diào)JS端晚树,JS就可以得到所需要的數(shù)據(jù)

[self.bridge registerHandler:@"getUserIdFromObjC"handler:^(iddata, WVJBResponseCallback responseCallback) {

??? NSLog(@"js call getUserIdFromObjC, data from js is %@", data);

?if(responseCallback) {

?//?反饋給JS

????? responseCallback(@{@"userId":?@"123456"});

??? }

}];


[self.bridge registerHandler:@"getBlogNameFromObjC"handler:^(iddata, WVJBResponseCallback responseCallback) {

??? NSLog(@"js call getBlogNameFromObjC, data from js is %@", data);

?if(responseCallback) {

?//?反饋給JS

????? responseCallback(@{@"blogName":?@"星仔"});

??? }

}];


第四步:直接調(diào)用JS端注冊(cè)的HandleName


[self.bridge callHandler:@"getUserInfos"data:@{@"name":?@"ddsds"}responseCallback:^(idresponseData) {

??? NSLog(@"from js: %@", responseData);

}];


三.JS端如何使用

??? <script>

????? window.onerror = function(err) {

??????? log('window.onerror: '+ err)

????? }


?/*這段代碼是固定的姻采,必須要放到j(luò)s中*/

????? function setupWebViewJavascriptBridge(callback) {

?if(window.WebViewJavascriptBridge) {?returncallback(WebViewJavascriptBridge); }

?if(window.WVJBCallbacks) {?returnwindow.WVJBCallbacks.push(callback); }

??????? window.WVJBCallbacks = [callback];

??????? var WVJBIframe = document.createElement('iframe');

WVJBIframe.style.display =?'none';

WVJBIframe.src =?'wvjbscheme://__BRIDGE_LOADED__';

??????? document.documentElement.appendChild(WVJBIframe);

setTimeout(function() { document.documentElement.removeChild(WVJBIframe) },?0)

????? }


?/*與OC交互的所有JS方法都要放在此處注冊(cè),才能調(diào)用通過JS調(diào)用OC或者讓OC調(diào)用這里的JS*/

????? setupWebViewJavascriptBridge(function(bridge) {

var uniqueId =?1

?????? function log(message, data) {

???????? var log = document.getElementById('log')

???????? var el = document.createElement('div')

el.className =?'logLine'

el.innerHTML = uniqueId++ +?'. '+ message +?':<br/>'+ JSON.stringify(data)

?if(log.children.length) {

??????????? log.insertBefore(el, log.children[0])

}?else{

?????????? log.appendChild(el)

???????? }

?????? }

?/* Initialize your app here */


?/*我們?cè)谶@注冊(cè)一個(gè)js調(diào)用OC的方法爵憎,不帶參數(shù)慨亲,且不用ObjC端反饋結(jié)果給JS:打開本demo對(duì)應(yīng)的博文*/

???? bridge.registerHandler('openWebviewBridgeArticle', function() {

???????? log("openWebviewBridgeArticle was called with by ObjC")

???? })

?/*JS給ObjC提供公開的API,在ObjC端可以手動(dòng)調(diào)用JS的這個(gè)API宝鼓。接收ObjC傳過來的參數(shù)刑棵,且可以回調(diào)ObjC*/-

????? bridge.registerHandler('token', function(data, responseCallback) {

???????? log("G星爺: ", data)

?????? responseCallback({這里給我返回拼接后的地址})

???? })

?/*JS給ObjC提供公開的API,ObjC端通過注冊(cè)愚铡,就可以在JS端調(diào)用此API時(shí)蛉签,得到回調(diào)。ObjC端可以在處理完成后沥寥,反饋給JS碍舍,這樣寫就是在載入頁面完成時(shí)就先調(diào)用*/

?????? bridge.callHandler('getUserIdFromObjC', function(responseData) {

??????? log("JS call ObjC's getUserIdFromObjC function, and js received response:", responseData)

????? })

?????? document.getElementById('blogIds').onclick = function (e) {

???????? log('js call objc: getBlogNameFromObjC')

???????? bridge.callHandler('ww', {'blogdURL':?'weidsfdl'}, function(response) {

????????????????????????? log('JS got response', response)

????????????????????????? })

?????? }

???? })


??? </script>

四.注意事項(xiàng)

1.當(dāng)出現(xiàn)這樣的提示的話,說明JS那邊已經(jīng)實(shí)現(xiàn)了名字為‘ww’的方法邑雅,但是iOS這邊沒有注冊(cè)片橡,

具體實(shí)現(xiàn)是:

[self.bridgeregisterHandler:@"ww"handler:^(id data, WVJBResponseCallback responseCallback) {

??? NSLog(@"js call getBlogNameFromObjC, data from js is %@", data);

??? if (responseCallback) {

????? // 反饋給JS

????? responseCallback(@{@"blogName": @"星仔"});

??? }

}];

2. 當(dāng)在push或者說頁面消失的時(shí)候,將bridge對(duì)象置為空淮野。

五.防止WebView長按實(shí)現(xiàn)的方法如下:

- (void)webViewDidFinishLoad:(UIWebView *)webView{

?//?禁用頁面元素選擇

??? [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];


//?禁用長按彈出ActionSheet

??? [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];

}

js文件下載地址:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捧书,一起剝皮案震驚了整個(gè)濱河市吹泡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌经瓷,老刑警劉巖爆哑,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異了嚎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)廊营,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門歪泳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人露筒,你說我怎么就攤上這事呐伞。” “怎么了慎式?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵伶氢,是天一觀的道長。 經(jīng)常有香客問我瘪吏,道長癣防,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任掌眠,我火速辦了婚禮蕾盯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蓝丙。我一直安慰自己级遭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布渺尘。 她就那樣靜靜地躺著挫鸽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸥跟。 梳的紋絲不亂的頭發(fā)上丢郊,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音医咨,去河邊找鬼蚂夕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腋逆,可吹牛的內(nèi)容都是我干的婿牍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惩歉,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼等脂!你這毒婦竟也來了俏蛮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤上遥,失蹤者是張志新(化名)和其女友劉穎搏屑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粉楚,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辣恋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了模软。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伟骨。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖燃异,靈堂內(nèi)的尸體忽然破棺而出携狭,到底是詐尸還是另有隱情,我是刑警寧澤回俐,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布逛腿,位于F島的核電站,受9級(jí)特大地震影響仅颇,放射性物質(zhì)發(fā)生泄漏单默。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一忘瓦、第九天 我趴在偏房一處隱蔽的房頂上張望雕凹。 院中可真熱鬧,春花似錦政冻、人聲如沸枚抵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汽摹。三九已至,卻和暖如春苦锨,著一層夾襖步出監(jiān)牢的瞬間逼泣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工舟舒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拉庶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓秃励,卻偏偏與公主長得像氏仗,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子夺鲜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • 原文地址 前言 Web 頁面中的 JS 與 iOS Native 如何交互是每個(gè) iOS 猿必須掌握的技能皆尔。而 J...
    小嘴冰涼別亂親閱讀 1,869評(píng)論 2 5
  • WebViewJavaScriptBridge是IOS中JS和OC交互的常用框架呐舔,支持以下兩種調(diào)用: 1. OC端...
    lim2閱讀 673評(píng)論 0 0
  • 最近在做的項(xiàng)目重點(diǎn)就是原生app與js的交互,以前也做過但是并沒有深入的了解和研究過慷蠕,因?yàn)檫@個(gè)項(xiàng)目我嘗試了三種方式...
    百事小武閱讀 4,411評(píng)論 0 6
  • WebViewJavascriptBridge應(yīng)該是當(dāng)前最流行最成功的OC與Web交互實(shí)現(xiàn)了珊拼。最近看了一下他的實(shí)現(xiàn)...
    廖丹_18be閱讀 3,123評(píng)論 0 4
  • 昨天是2018,1,7下午,雖然蘿莉昨個(gè)晚上沒怎么睡覺流炕,但是必須好好珍惜大瓶子放假的時(shí)間澎现!約上大瓶子一塊去吃手抓餅...
    蘿莉同學(xué)閱讀 284評(píng)論 0 0