Objective-C 與 JavaScript 互相調(diào)用:
iOS的原生界面基于Objective-C語言顾患,
UIWebView界面基于JavaScript語言拇泣。
問題:如何做OC和JS語言之間的跨語言相互調(diào)用滑绒?
Objective-C調(diào)用JavaScript:
- 通過UIWebView的 :
-(NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
方法實(shí)現(xiàn)带到,該方法向UIWebView傳遞一段需要執(zhí)行的JS文件遣总,完成執(zhí)行效果宙刘。 - 示例代碼:
//Objective-C:
- (BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(nonnull NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
NSURL *url = [request URL];
if ([[url scheme]isEqualToString:@"gap"]) {
[webView stringByEvaluatingJavaScriptFromString:@"alert('done')"];
return NO;
}
return YES;
}
JavaScript調(diào)用Objective-C:
沒有現(xiàn)成的API锄贷,利用UIWebView的特性:
在UIWebView內(nèi)發(fā)起的所有網(wǎng)絡(luò)請(qǐng)求译蒂,都可以通過delegate函數(shù)在原生界面得到通知。
請(qǐng)求的網(wǎng)址通常不是真實(shí)的地址谊却,類似于:gap://methodname?argument示例代碼:
創(chuàng)建一個(gè)臨時(shí)的隱藏的iFrame中加載特殊的網(wǎng)絡(luò)請(qǐng)求柔昼。
//通知iPhone UIWebView 加載url對(duì)應(yīng)的資源
//url的格式為:gap://something
function loadURL(url){
var iFrame;
iFrame = document.createElement("iFrame");
iFrame.setAttribute("src",url);
iFrame.setAttribute("style","display:none;");
iFrame.setAttribute("height","0px");
iFrame.setAttribute("width","0px");
iFrame.setAttribute("frameborder","0");
document.body.appendChild(iFrame);
//發(fā)起請(qǐng)求后這個(gè)iFrame就沒用了,所以需要從dom中移除掉它
iFrame.parentNode.removeChild(iFrame);
iFrame = null;
}
最后炎辨,也可以使用第三方開源庫(kù)實(shí)現(xiàn)相互調(diào)用的功能:
使用比較簡(jiǎn)單
WebViewJavaScriptBridge