在實(shí)際的開發(fā)中手機(jī)app經(jīng)常會(huì)嵌套H5的網(wǎng)頁,如果只是簡(jiǎn)單的嵌套,一個(gè)webView就可以??涩F(xiàn)實(shí)中常常會(huì)用到H5與webView的交互,需要網(wǎng)頁和webView互相傳遞信息。
(不太會(huì)用簡(jiǎn)書,格式寫的有點(diǎn)亂)
JS調(diào)用OC
1.攔截連接
webView可以監(jiān)測(cè)到所有網(wǎng)頁加載的連接 通過下面這個(gè)方法
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
DLog(@"request -> %@",request.URL.absoluteString);
if ([request.URL.absoluteString rangeOfString:@"http://10.0.0.263/goBack.html"].location != NSNotFound?) {
return NO;
}
return YES;
}
這里面你可以攔截到網(wǎng)頁要加載的鏈接,當(dāng)網(wǎng)頁需要向你傳遞信息的時(shí)候,比如點(diǎn)擊網(wǎng)頁的返回按鈕,就加載http://10.0.0.263/goBack.html,webView一旦攔截到這個(gè)鏈接,就可以在上面的if里面做想要的事情。當(dāng)然需要傳值的時(shí)候,可以在鏈接后面拼接參數(shù)。比如:
http://api.centwateck.com/hidetabs/id=1&name = @"jack"
這樣 攔截到鏈接之后,對(duì)參數(shù)按和后臺(tái)商量的格式就可進(jìn)行解析。
2. 直接調(diào)用oc方法
- (void)webViewDidFinishLoad:(UIWebView *)webView
在webView加載完畢的這個(gè)方法里做一些事情
JSContext *context = [webView? valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"wxpay"] = ^() {
這里 wxpay 是我與網(wǎng)頁程序員商量好的,一旦網(wǎng)頁上點(diǎn)擊了微信支付,就調(diào)用這個(gè)方法
這個(gè)是方法名,網(wǎng)頁就可以直接調(diào)用這個(gè)方法
NSArray *args = [JSContext currentArguments];
這個(gè)方法 你可以拿到j(luò)s傳遞給你的參數(shù)
然后將參數(shù)通過
toBool,toNumber ,toString轉(zhuǎn)成oc的類
PS:我沒轉(zhuǎn)直接用了,也沒事。
}
也可以這么寫:
context[@"wxpay"] = ^(NSString *title) {
? NSLog(@" ?%@ ?",title);
}
Warning:在block里面刷新UI的話,需要檢測(cè)一下block里面是否為主線程,不是主線程,控制臺(tái)一堆輸出,打上全局?jǐn)帱c(diǎn)會(huì)崩潰
這里可以這么解決一下
if ([NSThread isMainThread] == YES) {
//do something
}else {
dispatch_async(dispatch_get_main_queue(), ^{
//dosomething
});
}
OC調(diào)用JS
1.直接傳參數(shù)
在- (void)webViewDidFinishLoad:(UIWebView *)webView 這個(gè)方法里面直接調(diào)用下面的方法
NSString *jsString = [NSString stringWithFormat:@"doLog('%@','1')",dataString];
//doLog是你需要調(diào)用的網(wǎng)頁的方法名,參數(shù)根據(jù)你所需要的進(jìn)行傳值。
[webView stringByEvaluatingJavaScriptFromString:jsString];
Warning:這里的doLog()里面的()一定不要用中文的。不然的話,就刺激了。是一個(gè)同步的方法,使用它執(zhí)行JS方法時(shí),如果JS 方法比較耗的時(shí)候,會(huì)造成界面卡頓。
2.通過JSContent傳值
在- (void)webViewDidFinishLoad:(UIWebView *)webView 這個(gè)方法里面直接調(diào)用下面的方法
JSContext *jsctt = [webView
valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
JSValue *function = [jsctt objectForKeyedSubscript:@"test"];
[function callWithArguments:nil];
//這里[function callWithArguments:nil] 當(dāng)有參數(shù)的時(shí)候,可以傳遞一個(gè)數(shù)組, test是方法名
這里附上gitHub源碼連接 https://github.com/tianliangyihou/OCAndJS
webView還可以通過相應(yīng)的語句,對(duì)網(wǎng)頁進(jìn)行調(diào)整,如給圖片每張圖片加上點(diǎn)擊事件,或者圖片居中等,這個(gè)百度上很多方法。