OC与JS的简单的交互

作者: 七秒记忆的鱼儿 | 来源:发表于2016-03-24 13:34 被阅读457次

    现在iOS和html的混合开发是越来越普遍了,开发的效率也是大大的提高了,但是页面上的直接的交互也越来越重要了。今天又朋友问我,自己就小研究了下。
    1.OC与heml的交互现在还是使用UIWedView这个控件
    1>OC中调用heml中的方法时使用到UIWedView的stringByEvaluatingJavaScriptFromString的方法

      // 利用JS获得当前网页的标题
       [self.wedview stringByEvaluatingJavaScriptFromString:@"document.title;"];
    

    2>网页上的操作让OC界面发生的变化我们需要用到UIWedView的代理的方法

    /*  拦截wedview的请求
     *
     *  @param request        请求
     *
     *  @return 返回yes时可以发送请求  返回NO就是不可以
     */ 
    -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    

    下面来介绍下怎么实现的(在storybord拖控件设置大小,托线就不介绍了)
    1.我们应该知道加载的那个网页是吧,我自己写了个本地的网页作为测试
    // 加载网页 本地网页
    [self.wedview loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html"]]];
    // 设置代理
    self.wedview.delegate = self;

    2.实现代理

    warning 注意系统的方法只能多穿两个方法

      /**
       *  拦截wedview的请求
      *
      *  @param request        请求
      *
      *  @return 返回yes时可以发送请求  返回NO就是不可以
     */
    -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
        // 获取点击按钮上要获取的发送的请求
        NSString *URLString =[request.URL absoluteString];
          // 判断发送的请求是否包含下列特定的字符(应为要用到交互,所以不是个正确的连接,这个和写JS的约定好)
          NSString *scheme = @"xmg://";
         if ([URLString containsString:scheme]) {
        // schem 后面的方法名字和参数截取下来
        NSString *path =[URLString substringFromIndex:scheme.length];
        // 将方法名字和参数利用特定的符号截取开来 这个用的是@“?“
        NSArray *array =[path componentsSeparatedByString:@"?"];
        // 获取到方法名字
        NSString *methodName = [array firstObject];
        // 将方法名中的_特殊符号用OC语法中的:替换掉,形成方法名
        NSString *newmethodName = [methodName stringByReplacingOccurrencesOfString:@"_" withString:@":"];
        // 获取参数
        NSArray *params = nil;
        // 判断下js发送的请求里面是否为有参数
        if (array.count == 2) {
            // 也是利用特殊的符号截取到参数的数组
            params = [[array lastObject] componentsSeparatedByString:@"&"];
        }
        // 判断是否有第二个参数
        NSString *twoString = params.count<=1?nil:[params lastObject];
          #warning 注意系统的方法只能多穿两个方法 ,我也查询了别人穿多个参数的方法,写了方法,后续上传
        // 调用方法
        [self performSelector:NSSelectorFromString(newmethodName) withObject:[params firstObject] withObject:twoString];
           #warning 注意 一定记得返回NO 不然就UIWedView就跳转页面了
        return NO;
           }
          return YES;
          }
    

    3.注意 一定要在控制器中实现你要调用的方法,不然真的会崩溃的。
    - (void)sendMessage:(NSString *)number number2:(NSString *)number2{
    NSLog(@" %@ %@ ", number, number2);
    }
    这个为自己写的网页内容

    3314D8C6-8CEB-42B6-88D0-8BC859754478.png

    相关文章

      网友评论

      • Who昵称:我感觉这样也不是很好,虽然说是自己写的HTML 这个HTML 还是要加到工程里面的,最好写成一个网址的形式,通过调用这个网址类型的HTML 来判断怎么跳转,里面用js 进行写,
        七秒记忆的鱼儿:@Who昵称 是的,现在很少使用这种拦截式的了,现在都是js注入式的写的

      本文标题:OC与JS的简单的交互

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