iOS 初探基于UIWebView的混编

Objective-C 与 JavaScript 互相调用:


iOS的原生界面基于Objective-C语言,
UIWebView界面基于JavaScript语言。

问题:如何做OC和JS语言之间的跨语言相互调用?

iOS 初探基于UIWebView的混编_第1张图片
设计图
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

你可能感兴趣的:(iOS 初探基于UIWebView的混编)