美文网首页
javascript与OC的相互调用 (2012-09-04 1

javascript与OC的相互调用 (2012-09-04 1

作者: 单手三万行无bug | 来源:发表于2016-03-22 12:05 被阅读29次

    编写目的:本文重点阐述在iOS系统上通用的本地Objective-C代码与基于Javascript的Web的应用的互操作的基本方法,并通过具体范例说明两种代码的交互方式;

    阅读前提:熟悉iOS系统的UIWebView的功能、调用方法,相应的UIWebViewDelegate委托的使用方法,并了解Javascript函数的基本语法与函数调用方法;

    说明:正文部分红色字体表示Javascript代码,蓝色字体部分表示Objectvie-C代码(没办法贴格式了,将就看吧:();

    正文:

    1.      Objective-C调用Javascript方法:

    前提:

    UIWebView已经完全加载完成包含需要调用的页面(注:在UIWebViewDelegate托管中通过监视- (void)webViewDidFinishLoad:(UIWebView *)webView调用来确定页面是否加载完成)。

    方法:

    假设某视图对象的子视图属性self.webview加载的页面包含如下Javascript函数:

    function getString(){ return “Hello javascript!”;}

    并且该函数在该页面上可被正常调用,则可以通过形如下面的Objectvie-C方法调用此函数:

    NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"getString();"];

    该函数调用实际模拟了页面上的一次Javascript函数调用,因此在该函数内部任何有效的Javascript代码都可被执行!该Objective-C代码返回值为被调用的Javascript代码的返回值,在上例中,str的值将被赋为@”Hello javascript!”。

    被调用的函数可以带有字符串或数值型的参数。若调用的Javascript函数名称带有参数,需保证传进去的参数的格式正确性,特别是字符串参数的引号很容易被忽略。

    2.      系统响应页面Javascript代码:

    前提:

    需要实现UIWebViewDelegate的

    - (BOOL)webView:(UIWebView *)webView

    shouldStartLoadWithRequest:(NSURLRequest *)request

    navigationType:(UIWebViewNavigationType)navigationType;

    托管函数(以下简称跳转监视函数)并将实现了该托管函数的对象设置为UIWebView的delegate。

    方法:

    UIWebView的当前页面将要被Javascript代码通过以下方式转向的时候,会调用上述跳转监视函数:

    window.location.href=”http://www.strongsoft.net”;

    此时实现了该托管协议的对象的跳转监视函数会被调用,通过如下代码监视浏览器跳转的地址:

    NSString *url = [[request URL] absoluteString];

    若该托管函数返回值为NO,则页面UIWebView的页面跳转将被否决。利用这一思路,监视页面上的特定格式的跳转地址加以拦截,并执行相应的本地代码,即可实现Javascript与Objective-C代码的交互。

    例如,规定拦截URL地址前缀为”objc:”的所有地址,并且用if…else…语句判定本地需要执行的代码,则实现形如以下格式的Objective-C托管函数:

    - (BOOL)webView:(UIWebView *)webView

    shouldStartLoadWithRequest:(NSURLRequest *)request

    navigationType:(UIWebViewNavigationType)navigationType

    {

    NSString *urlString = [[request URL] absoluteString];

    NSArray *urlComps = [urlString componentsSeparatedByString:@":"];

    if([urlComps count] && [[urlComps objectAtIndex:o] isEqualToString:@"objc"])

    {

    NSString *funcStr = [urlComps objectAtIndex:1];

    if([funcStr isEqualToString:@"doFunc1"])

    {

    }

    else if([funcStr isEqualToString:@"doFunc2"])

    {

    }

    return NO;

    }

    return YES;

    }

    当需要调用本地函数1时,可以通过如下Javascript函数进行:

    window.location.href=”objc:doFunc1”;

    根据上述思路,可以完善通过Javascript调用本地带参数的Objective-C代码。

    相关文章

      网友评论

          本文标题:javascript与OC的相互调用 (2012-09-04 1

          本文链接:https://www.haomeiwen.com/subject/hkqllttx.html