UIWebView簡單的OC和JS交互框架

最近工作中跟客戶對接遇到有些老項目用UIWebView的情況,在網(wǎng)上看到一個簡單的框架,系統(tǒng)的方法就不說了,網(wǎng)上有很多,這里簡單介紹一下此框架 OC 和 JS交互的使用方法

1>引入框架

pod 'WebViewJavascriptBridge'

2> 開始使用

#import "WebViewJavascriptBridge.h"

@interface BXViewController ()

@property(nonatomic, strong)UIWebView *webView;

@property(nonatomic,strong)WebViewJavascriptBridge *bridge;

@end

@implementation BXViewController

- (void)viewDidLoad {

? ? [super viewDidLoad];


? ? self.webView = [[UIWebView alloc] init];

? ? [self.view addSubview:self.webView];

? ? self.webView.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);

? ? // 自動對頁面進行縮放以適應(yīng)屏幕

? ? self.webView.scalesPageToFit = YES;

? ? // 需要在代理方法中與js進行交互

? ? self.webView.delegate=self;

? ? // 取消webView的彈簧效果

? ? [(UIScrollView *)[[self.webView subviews] objectAtIndex:0] setBounces:NO];


? ? //初始化? WebViewJavascriptBridge

? ? if(_bridge) {return; }

? ? [WebViewJavascriptBridge enableLogging];

? ? _bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView];

? ? [_bridge setWebViewDelegate:self];


? ? //請求加載html猎醇,注意:這里h5加載完,會自動執(zhí)行一個調(diào)用oc的方法

? ? [self loadExamplePage:self.webView];


? ? //申明js調(diào)用oc方法的處理事件郎笆,這里寫了后藐不,h5那邊只要請求了几颜,oc內(nèi)部就會響應(yīng)

? ? [selfJS2OC];


? ? //模擬操作:2秒后,oc會調(diào)用js的方法

? ? //注意:這里厲害的是,我們不需要等待html加載完成擎宝,就能處理oc的請求事件籍铁;此外涡上,webview的request 也可以在這個請求后面執(zhí)行(可以把上面的[self loadExamplePage:webView]放到[self OC2JS]后面執(zhí)行,結(jié)果是一樣的)

? ? dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

? ? ? ? [selfOC2JS];

? ? });


}

-(void)JS2OC{

? ? /*

?? ? 含義:JS調(diào)用OC

?? ? @param registerHandler 要注冊的事件名稱(比如這里我們?yōu)閘oginAction)

?? ? @param handel 回調(diào)block函數(shù) 當(dāng)后臺觸發(fā)這個事件的時候會執(zhí)行block里面的代碼

?? ? */

? ? [_bridge registerHandler:@"contactList"handler:^(iddata, WVJBResponseCallback responseCallback) {

? ? ? ? // data js頁面?zhèn)鬟^來的參數(shù)? 假設(shè)這里是用戶名和姓名拒名,字典格式

? ? ? ? NSLog(@"JS調(diào)用OC吩愧,并傳值過來");


? ? ? ? // 利用data參數(shù)處理自己的邏輯

? ? ? ? NSDictionary *dict = (NSDictionary *)data;

? ? ? ? NSString *str = [NSString stringWithFormat:@"用戶名:%@? 姓名:%@",dict[@"userId"],dict[@"name"]];

? ? ? ? [selfrenderButtons:str];


? ? ? ? // responseCallback 給js的回復(fù)

? ? ? ? responseCallback(@"報告,oc已收到j(luò)s的請求");

? ? }];


}

-(void)OC2JS{

? ? /*

?? ? 含義:OC調(diào)用JS

?? ? @param callHandler 商定的事件名稱,用來調(diào)用網(wǎng)頁里面相應(yīng)的事件實現(xiàn)

?? ? @param data id類型,相當(dāng)于我們函數(shù)中的參數(shù),向網(wǎng)頁傳遞函數(shù)執(zhí)行需要的參數(shù)

?? ? 注意增显,這里callHandler分3種雁佳,根據(jù)需不需要傳參數(shù)和需不需要后臺返回執(zhí)行結(jié)果來決定用哪個

?? ? */

? ? //[_bridge callHandler:@"registerAction" data:@"我是oc請求js的參數(shù)"];

? ? [_bridge callHandler:@"registerAction"data:@"uid:123 pwd:123"responseCallback:^(idresponseData) {

? ? ? ? NSLog(@"oc請求js后接受的回調(diào)結(jié)果:%@",responseData);

? ? }];

}

- (void)renderButtons:(NSString*)str {

? ? NSLog(@"JS調(diào)用OC,取到參數(shù)為: %@",str);

}

// 當(dāng)點擊頁面進行加載數(shù)據(jù)的時候調(diào)用

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{

? ? // 獲取點擊頁面加載的url

? ? NSString *url = request.URL.absoluteString;

? ? NSLog(@"==========獲取點擊頁面加載的url=========%@",url);

? ? if ([url rangeOfString:@"https://m.baidu.com"].location != NSNotFound) {

? ? ? ? // 通過獲取當(dāng)前點擊頁面加載的url與指定url進行比較同云,攔截頁面請求糖权,進行自己的邏輯處理

? ? ? ? // 進行移動端的邏輯處理

? ? ? ? //? ? ? ? UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"" message:@"攔截頁面方法" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil, nil];

? ? ? ? //? ? ? ? [alert show];

? ? ? ? returnNO;

? ? }

?? ?return YES;

}

// 當(dāng)頁面開始加載的時候調(diào)用

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

}

// 當(dāng)頁面加載完成的時候調(diào)用

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

}

// 頁面加載失敗的時候調(diào)用

- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error{

}

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

? ? ?NSString *urlStr = @"https://www.baidu.com";

?? ?NSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:urlStr]];

? ? [webViewloadRequest:request];

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市梢杭,隨后出現(xiàn)的幾起案子温兼,更是在濱河造成了極大的恐慌,老刑警劉巖武契,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件募判,死亡現(xiàn)場離奇詭異,居然都是意外死亡咒唆,警方通過查閱死者的電腦和手機届垫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來全释,“玉大人装处,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵重挑,是天一觀的道長榆骚。 經(jīng)常有香客問我,道長箫老,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任黔州,我火速辦了婚禮耍鬓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘流妻。我一直安慰自己牲蜀,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布绅这。 她就那樣靜靜地躺著涣达,像睡著了一般。 火紅的嫁衣襯著肌膚如雪证薇。 梳的紋絲不亂的頭發(fā)上峭判,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音棕叫,去河邊找鬼林螃。 笑死,一個胖子當(dāng)著我的面吹牛俺泣,可吹牛的內(nèi)容都是我干的疗认。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼伏钠,長吁一口氣:“原來是場噩夢啊……” “哼横漏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起熟掂,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤缎浇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赴肚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體素跺,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年誉券,在試婚紗的時候發(fā)現(xiàn)自己被綠了指厌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡踊跟,死狀恐怖踩验,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤箕憾,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布牡借,位于F島的核電站,受9級特大地震影響袭异,放射性物質(zhì)發(fā)生泄漏蓖捶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一扁远、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刻像,春花似錦畅买、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溜徙,卻和暖如春湃缎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蠢壹。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工嗓违, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人图贸。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓蹂季,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疏日。 傳聞我的和親對象是個殘疾皇子偿洁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

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