OC与javascript进行交互

转载 2016年05月30日 17:06:43

OC与javascript进行交互


由于H5具有跨平台的优势,在很多情况下可能会使用到,但是对于混编有时候会是必要的。
1> 使用OC调用javascript代码
首先要了解一下web的加载;
在OC中,加载网页的控件是UIWebView;
一般我们需要做的是先加载原来的Web,然后再进行处理,这样的话,就会用到UIWebView的代理方法。

// 这个方法是网页加载完毕之后进行调用
- (void)webViewDidFinishLoad:(UIWebView *)webView;

当网页加载完毕之后,就可以很轻松的拿到当前加载网页的<body>,这样的话我们就可以通过执行js代码进行处理原来的网页

 NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML;"];

通过上面这个方法可以获得网页的结构,在自己不确定网页结构的情况下,可以打印出来看一下,这样就可以很容易找到自己要处理的内容。

然后执行js代码,可以通过下面的方法进行加载js代码,

 - (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

要注意的是参数是字符串,所以我们需要把代码包装在字符串里面

 NSMutableString *js = [NSMutableString stringWithString:@"这里写js代码"];

多行js代码之间可以使用反斜线(\)连接。举个栗子:

 NSMutableString *js = [NSMutableString stringWithString:@"\
                           var  footer = document.getElementsByTagName('footer')[0];\
                           footer.parentNode.removeChild(footer);\
                           var header = document.getElementsByTagName('header')[0];\
                           header.parentNode.removeChild(header);\
                           "];

然后执行js

 [webView stringByEvaluatingJavaScriptFromString:js];

这样就可以将自己添加的js添加到加载到得网页中。

2>使用JS调用OC的代码
使用JS调用OC并非像上面的那么简单.这里会使用UIWebView的另外的一个代理方法

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

上面这个方法在每次进行加载网页的时候都会执行,可以监听每一次webView发送的请求,如果返回值是 YES, 则说明可以进行加载网页, 如果返回的是 NO, 则说明禁止加载该网页.
那这个方法应该怎么使用呢?
因为在JS中无法直接调用OC的方法,我们的思路是将js中的事件转化成自定义的一种协议,当执行协议时,webView的代理方法进行监听,如果自己需要的方法,则可以执行OC方法.
下面看了一段HTML代码

<body>
    <div>
        <button onclick="fn_click();">按钮1</button>
    </div>
<script type="text/javascript">
    function fn_click() {
        // 自定义协议,进行动态跳转
        window.location.href = 'dz://click';
    }
</script>
</body>

然后对网页进行监听

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *url = request.URL.absoluteString;
   // 判断请求是否是自定义的,如果是自定义的,则进行处理
    NSRange range = [url rangeOfString:@"dz://"];
    NSUInteger loc = range.location;
    if (loc != NSNotFound) { 
        NSString *method = [url substringFromIndex:loc + range.length]; // 取出JS方法的方法名
        SEL sel = NSSelectorFromString(method); // 将JS方法名转化为OC的方法名
        [self performSelector:sel withObject:nil];

    }
    return YES;
}

通过上面的一段代码,就可以在OC中调用JS方法。

- (void)click {
 NSLog(@“点击了btn”);
}

JS与原生OC的三种交互方式

JS与原生OC的三种交互方式大家在做项目的时候应该也遇到过需要h5与OC之间通信,来实现某种特定的效果,于是我总结一下最近用到过的这两者之间的交互的方式: 通过在UIWebView的代理方法里拦截UR...
  • cljAndPean
  • cljAndPean
  • 2017年03月26日 16:27
  • 1338

iOS 开发中OC 与 JS的交互

iOS原生应用和web页面的交互有iOS7之后的JavaScriptCore、拦截协议、第三方框架WebViewJavaScriptBridge、iOS8之后的WKWebView几种方法,这一章我们主...
  • Tony_18736165317
  • Tony_18736165317
  • 2017年03月24日 19:38
  • 1741

OC与JS的相互交互

在Objective-C中提供了一个JavaScriptCore.frame类库来进行OC与JS之间的交互,在OC中可通过此类库来进行与JS的交互...
  • haoxindasoft
  • haoxindasoft
  • 2016年03月05日 12:56
  • 1051

js与oc做交互的一个demo

前几天老大安排与app开发人员做交互,之前没接触过,然后各种百度,各种博客看完之后,今天整理出这么一个demo,...
  • u011025083
  • u011025083
  • 2017年07月11日 17:11
  • 110

【REACT NATIVE 系列教程之十二】REACT NATIVE(JS/ES)与IOS(OBJECT-C)交互通信

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/react-native/2301.html一...
  • xiaominghimi
  • xiaominghimi
  • 2016年06月04日 22:18
  • 4890

OC与JS的交互(iOS与H5混编)

OC与JS的交互(iOS与H5混编)在开发过程中,经常会出现需要iOS移动端与H5混编的使用场景。 iOS中加载html网页, 可以使用UIWebView或WKWebView. 本篇博客将介绍两种控件...
  • SandyLoo
  • SandyLoo
  • 2017年03月24日 14:50
  • 5371

OC和JS的交互,native页面和web页面混合

这里照搬Github的Demo,其实还是很易懂的,首先,要在控制器的.h文件当中实现浏览器控件的协议: 1 #import 2 3 @interface ExampleAppViewContro...
  • ios_xumin
  • ios_xumin
  • 2016年08月04日 15:57
  • 370

iOS 开发 Object-C和JavaScript交互详解之OC与JS交互在UIWebView中使用

1.需求分析在浏览器终端中写js代码删除网页中不需要的元素 2.OC调用JS需要实现的代理方法网页加载完成时调用的代理方法 当网页加载完成之后,通过OC的方法调用JS的代码,删除网页展示时不需要的内...
  • kuangdacaikuang
  • kuangdacaikuang
  • 2016年11月24日 09:06
  • 789

javascript与浏览器的数据交互

1.从浏览器中获取数据 2.向浏览器中s
  • seacean2000
  • seacean2000
  • 2014年10月28日 22:12
  • 564

{Unity} c#和iOS Objective-C交互

Unity 编写iOS native的Plugin, 接入一些sdk什么的,需要和OC进行交互。下面已我写的ios支付插件为例,总结一下。 1)c#调用OC代码 首先需要在c#中声明OC的函数:...
  • n5
  • n5
  • 2016年01月15日 17:54
  • 8705
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OC与javascript进行交互
举报原因:
原因补充:

(最多只允许输入30个字)