平时开发难免会遇到Native和Web对接的情况, 在通常情况下, 都是需要Native提供一些数据(同步或者异步)的接口给JS, 在项目框架已经成熟的一些公司, 你根本不需要考虑底层的原理是怎样的, 只要包装好一个接口给Web就可以了. 但是作为一个合格的开发, 我们需要知道底层的原理.
OC和JS交互的几个关键点
1 OC调用JS
OC调用JS很简单, 就是利用
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
这个接口, OC传script
给JS达到调用JS的目的, 实际开发中也很少会用到OC调用JS的情况, 因为通常Web能做的Native也能做, 做这么久开发, 只有一种情况下会出现OC调用JS: 当Web需要用到服务器给的数据来刷新UI, 但是Web又不想直接接服务器的通知.(主要因为Web和服务器之间的链接不是长连接, 但是Http现在也是支持长连接的, 至于为什么没这样做, 小编能力有限, 还不太清楚).
2 JS调OC
JS调用OC, 这个是我们开发中最常见的, 原理相对复杂一些, 简单说就是, OC注册了一些方法, 这些方法存在一个字典中, 当JS调用OC的时候, JS会改变当前iframe的src, 这样就会触发UIWebView的
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
这个代理方法, 然后在这里OC通过stringByEvaluatingJavaScriptFromString
拿到JS调用OC时候传递的参数信息, 并将参数转成对象, 然后遍历最开始OC注册的方法字典, 找到对应的并执行之, 就达到了JS调用OC的目的.
这里存在3个比较关键的步骤:
1 JS中保存了调用的方法名, 参数, 回调等信息
2 JS改变frame的src触发Native代码
3 Native通过stringByEvaluatingJavaScriptFromString
取出保存在JS中的信息.
由于篇幅有限(不想把这篇文章写的太长), 这里只是对OC和JS交互做简要的概述, 都是些纯理论的东西, 下一篇将会详细阐述(show you the code)OC和JS到底是如何交互的.