最近工作中跟客戶對接遇到有些老項目用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];
}