iOS和JS的交互

在iOS的WebKit来到之前,iOS中和js的交互,一直通过UIWebView来进行,其中有两个经常使用的API,一个是JS调用iOS原生:

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

在这个UIWebView的代理方法中,可以通过request拦截到想要进行操作的链接,而从在iOS原生中执行一些操作,达到JS调用iOS的目的。

另外一个方法就是iOS调用JS:

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

将想要调用的方法动过script传递给JS。
从上面两个方法中,可以看出JS调用iOS为异步调用,iOS调用JS为同步调用。

通过这两个方法的直接调用就可以实现JS和iOS的互相调用,例如获取网页的标题显示在导航栏上,注入JS代码改变网页的样式等等。如果公司里只有iOS客户端,这些就足够了,但是当同时做的有iOS和Android两个客户端的时候,会发现原来在iOS方便的同时,web的同学因为iOS和Android调用机制的不同,或许不是那么方便。原因就是在iOS中,如果想要上面说的代理方法调用,必须是通过重定向来完成。但是Android客户端就不需要这么做。比如说在网页中点击了一个按钮要弹出客户端的一个页面,如果在JS中直接调用onclick方法或者类似的方法,在iOS中就检测不到网页中做了什么操作,也就弹不出页面。

为了解决这个问题,我们可以在我们想要进行互相调用的网页中注入一些代码使得JS调用方法的时候,可以让iOS中可以检测得到。比较推荐的就是在网页中添加iframe,但是iframe的display设为不显示,这样我们通过修改iFrame的src就完成了一次重定向,就可以让iOS检测到调用。通过不同的src就完成了JS调用不同的iOS代码。当然我们也可以在src中添加不同的路径,来达到传递参数的作用。

总结起来流程就是当打开一个网页时,这个网页是我们需要调用原生代码的,那么我们先通过stringByEvaluatingJavaScriptFromString 这个方法注入,我们事先写好的JS代码,在这份代码里,我们主要的目的是添加iFrame。当JS点击了一个按钮时,调用了我们注入在网页中的方法,由于这个方法的内部,我们添加了一个iFrame并设置了iFrame的src,这时iOS的代理方法就拦截到了这个操作,我们通过解析上面说的request 参数,可以获取src里的信息,根据src的不同,我们调用了不同的原生操作,JS调用iOS的流程完成。

当然需要注入的JS代码,是需要有一定的JS基础,才能完成,这部分主要是web的同学来完成。
对于iOS和JS的调用,各路大神也开源了很多优秀的代码,大部分时候我们直接使用就可以达成目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值