OC與JS的交互

在實(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è)百度上很多方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容