Objective-C 与 JavaScript 互相调用:
iOS的原生界面基于Objective-C语言,
UIWebView界面基于JavaScript语言。
问题:如何做OC和JS语言之间的跨语言相互调用?
Objective-C调用JavaScript:
- 通过UIWebView的 :
-(NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
方法实现,该方法向UIWebView传递一段需要执行的JS文件,完成执行效果。 - 示例代码:
//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调用Objective-C:
没有现成的API,利用UIWebView的特性:
在UIWebView内发起的所有网络请求,都可以通过delegate函数在原生界面得到通知。
请求的网址通常不是真实的地址,类似于:gap://methodname?argument示例代码:
创建一个临时的隐藏的iFrame中加载特殊的网络请求。
//通知iPhone UIWebView 加载url对应的资源
//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);
//发起请求后这个iFrame就没用了,所以需要从dom中移除掉它
iFrame.parentNode.removeChild(iFrame);
iFrame = null;
}
最后,也可以使用第三方开源库实现相互调用的功能:
使用比较简单
WebViewJavaScriptBridge