UIWebView的js和OC交互

UIWebView的js和OC交互方式


其包括三種方式:

第一種::UIWebViewDelegate(代理方法)

第二種: JavaScriptCore

第三種: WebViewJavascript Bridge

下面就按照順序依次展開,我推薦使用前兩種,因為第三種需要依賴第三方框架,還有個缺點就是不一定能夠攔截成功,第三種方法知道就行了.廢話不多說開始正題.

一.UIWebViewDelegate

這種方式是最簡單的,我在實際項目中用的就是這一種,簡單方便實用,主要是根據(jù)UIWebViewDelegate的代理方法進行攔截.

-(BOOL)webView:(UIWebView *)webViewshouldStartLoadWithRequest:(NSURLRequest *)requestnavigationType:(UIWebViewNavigationType)navigationType{}

例如:www.baidu.com網(wǎng)頁為例


點擊新聞按鈕,根據(jù)shouldStartLoadWithRequest這個方法,打印出返回的url地址為

-(BOOL)webView:(UIWebView *)webViewshouldStartLoadWithRequest:(NSURLRequest *)requestnavigationType:(UIWebViewNavigationType)navigationType{

? ? ? NSString *requestStr = [request.URL absoluteString];

NSLog(@"%@",requestStr);

}


-(BOOL)webView:(UIWebView *)webViewshouldStartLoadWithRequest:(NSURLRequest *)requestnavigationType:(UIWebViewNavigationType)navigationType{

NSString *requestStr=[request.URLabsoluteString];

NSLog(@"%@",requestStr);

//判斷返回的url是否包含news這個字符串,如果有進入if判斷,進行攔截,如果沒有,則return YES,放行;

NSRangenewRange=[[requestStrlowercaseString]rangeOfString:@"news"];

if(newRange.length>0){

//進行你需要的操作

returnNO;

}

returnYES;

}

二.JavaScriptCore(這個是iOS7之后蘋果推出的一JS和OC交互的一個框架,極大的方便了我們對js的操作)

相關(guān)的幾個類

/*

JS執(zhí)行的環(huán)境评甜,同時也通過JSVirtualMachine管理著所有對象的生命周期灰粮,每個JSValue都和JSContext相關(guān)聯(lián)并且強引用context。

*/

#import "JSContext.h"

/*

JS對象在JSVirtualMachine中的一個強引用忍坷,其實就是Hybird對象粘舟。我們對JS的操作都是通過它。并且每個JSValue都是強引用一個context佩研。同時柑肴,OC和JS對象之間的轉(zhuǎn)換也是通過它

*/

#import "JSValue.h"

/*

JS和OC對象的內(nèi)存管理輔助對象。由于JS內(nèi)存管理是垃圾回收旬薯,并且JS中的對象都是強引用晰骑,而OC是引用計數(shù)。如果雙方相互引用绊序,勢必會造成循環(huán)引用硕舆,而導(dǎo)致內(nèi)存泄露。我們可以用JSManagedValue保存JSValue來避免骤公。

*/

#import "JSManagedValue.h"

/*

JS運行的虛擬機抚官,有獨立的堆空間和垃圾回收機制。

*/

#import "JSVirtualMachine.h"

/*

一個協(xié)議阶捆,如果JS對象想直接調(diào)用OC對象里面的方法和屬性凌节,那么這個OC對象只要實現(xiàn)這個JSExport協(xié)議就可以了。

*/

#import "JSExport.h"

接下來就是如何去通過js來調(diào)用oc的方法了

//首先你要在本地的html文件里注冊一個按鈕,按鈕的打擊名字jsButton

JavaScriptCore測試頁面

//首先你要在本地的html文件里注冊一個按鈕,按鈕的打擊名字jsButton

JavaScriptCore測試頁面

JS按鈕

//然后在加載完成的方法里通過JSContext來獲取相應(yīng)操作的key值.key值是html文件里點擊方法的名字,并且調(diào)用你需要的操作

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

JSContext *context=[self.webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

context[@"jsButton"]= ^{

//在這里調(diào)用你需要的操作

UIAlertController *alert=[UIAlertControlleralertControllerWithTitle:@"點擊了JS按鈕"message:@""preferredStyle:(UIAlertControllerStyleAlert)];

UIAlertAction *sureAlertAction=[UIAlertActionactionWithTitle:@"OK"style:(UIAlertActionStyleDefault)handler:^(UIAlertAction *_Nonnullaction){

}];

[alertaddAction:sureAlertAction];

[selfpresentViewController:alertanimated:YEScompletion:^{

}];

};

}

三.WebViewJavascriptBridge

第三種方法是通過WebViewJavascriptBridge這個第三方庫,把js和oc之間搭建一個橋,來實現(xiàn)相互通信,這個是我最不推薦的一種方法,因為他需要依賴第三方庫來實現(xiàn),通過互相注冊方法,增加代碼量并且并不是每次方法都能注冊上,有一定的失敗幾率,由于不推薦,所以就安排在最后,不做太詳細的解釋

3.1創(chuàng)建webview

UIWebView*webView=[[UIWebViewalloc]initWithFrame:self.view.bounds];

[self.viewaddSubview:webView];

NSString *path=[[NSBundlemainBundle]pathForResource:@"JSBridge"ofType:@"html"];

NSURL *baseURL=[NSURLfileURLWithPath:[[NSBundlemainBundle]bundlePath]];

NSString *htmlString=[NSStringstringWithContentsOfFile:pathencoding:NSUTF8StringEncodingerror:nil];

[webViewloadHTMLString:htmlStringbaseURL:baseURL];

[self.viewaddSubview:webView];

3.2創(chuàng)建WebViewJavascriptBridge

[WebViewJavascriptBridgeenableLogging];

_bridge=[WebViewJavascriptBridgebridgeForWebView:webView];

[_bridgesetWebViewDelegate:self];

3.3注冊js要調(diào)用Native

//handlerName:需要調(diào)用js的名字

//handler:需要oc進行的操作

-(void)registerHandler:(NSString *)handlerNamehandler:(WVJBHandler)handler{

[_bridgeregisterHandler:@"scanClick"handler:^(iddata,WVJBResponseCallbackresponseCallback){

//需要進行的操作

UIAlertController *alert=[UIAlertControlleralertControllerWithTitle:@"點擊了按鈕"message:@""preferredStyle:(UIAlertControllerStyleAlert)];

UIAlertAction *sureAlertAction=[UIAlertActionactionWithTitle:@"OK"style:(UIAlertActionStyleDefault)handler:^(UIAlertAction *_Nonnullaction){

}];

[alertaddAction:sureAlertAction];

[selfpresentViewController:alertanimated:YEScompletion:^{

}];

}];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洒试,一起剝皮案震驚了整個濱河市扣讼,隨后出現(xiàn)的幾起案子莺葫,更是在濱河造成了極大的恐慌机错,老刑警劉巖偏螺,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捕犬,居然都是意外死亡跷坝,警方通過查閱死者的電腦和手機酵镜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柴钻,“玉大人淮韭,你說我怎么就攤上這事√欤” “怎么了靠粪?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長毫蚓。 經(jīng)常有香客問我占键,道長,這世上最難降的妖魔是什么元潘? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任畔乙,我火速辦了婚禮,結(jié)果婚禮上翩概,老公的妹妹穿的比我還像新娘牲距。我一直安慰自己,他們只是感情好钥庇,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布牍鞠。 她就那樣靜靜地躺著,像睡著了一般评姨。 火紅的嫁衣襯著肌膚如雪难述。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天吐句,我揣著相機與錄音胁后,去河邊找鬼。 笑死蕴侧,一個胖子當(dāng)著我的面吹牛择同,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播净宵,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼裹纳!你這毒婦竟也來了择葡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤剃氧,失蹤者是張志新(化名)和其女友劉穎敏储,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朋鞍,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡已添,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年妥箕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片更舞。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡畦幢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缆蝉,到底是詐尸還是另有隱情宇葱,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布刊头,位于F島的核電站黍瞧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏原杂。R本人自食惡果不足惜印颤,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望穿肄。 院中可真熱鬧年局,春花似錦、人聲如沸被碗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锐朴。三九已至兴喂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間焚志,已是汗流浹背衣迷。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酱酬,地道東北人壶谒。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像膳沽,于是被迫代替她去往敵國和親汗菜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 隨著H5技術(shù)的興起挑社,在iOS開發(fā)過程中陨界,難免會遇到原生應(yīng)用需要和H5頁面交互的問題。其中會涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,060評論 1 8
  • 鏈接:http://ios.jobbole.com/89330/ 其實一直想給大家整理一下JS與OC的交互,但是沒...
    Kean_Qi閱讀 378評論 0 1
  • OC與JS交互之JavaScriptCore 本文摘抄自:https://hjgitbook.gitbooks.i...
    大沖哥閱讀 1,017評論 0 1
  • JavaScriptCore框架主要是用來實現(xiàn)iOS與H5的交互痛阻。由于現(xiàn)在混合編程越來越多菌瘪,H5的相對講多,所以研...
    水靈芳蕥閱讀 1,386評論 1 8
  • 今天的月亮真美啊阱当。 看到8.15寫的見到你沒有很激動俏扩,也沒有陌生糜工,那大概就是踏實的感覺吧。 總是想起你录淡,就連看書時...
    Z三石Z閱讀 137評論 0 0