iOS 和H5打交道的那些事 JavaScript & iOS

前言:

现在面试都很流行问的一个问题:H5 和iOS 交互做过吗?

做过?说说具体如何实现。没做过?不好意思我们再考虑一下。

今天就和大家一起分享,探讨这个流行问题的答案,首先我们要有一个自己的H5页面,还要有一个xcode,以及一个大脑。

交互方法一:stringByEvaluatingJavaScriptFromString

这个方法可以传递数据给H5,也可以调用H5的function,拿到返回值到app中,这也需要H5和app做一个相互约束的方法名称才能完成此操作。
[code lang=”Objective-C”]UIWebViewDelegate:- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType[/code]
这个方式可以在点击H5按钮等点击事件时做相应的拦截,截取需要的信息

注:这个方法是放在主线程进行的,所以有时会出现卡顿现象影响用户体验

交互方法二:JavaScriptCore

JavaScriptCore是iOS7之后苹果推出的JS交互方法,交互也相对简单了很多。

首先包含文件:

#import <JavaScriptCore/JavaScriptCore.h>

我们可以在webViewDidFinishLoad 里面获取JS的上下文
[code lang=”Objective-C”]JSContext *context = [webView valueForKeyPath:@”documentView.webView.mainFrame.javaScriptContext”];[/code]
在H5调用app的时:
[code lang=”Objective-C”]// xxxx 是H5中的方法名称,可以通过此方法调用app端做相应操作,可以在JSValue里面获取相应的值做处理
context[@”xxxx”] = ^() {
NSArray *args = [JSContext currentArguments];
for (JSValue *jsVal in args) {
}
}[/code]
app想调用H5则是:
[code lang=”Objective-C”]// xxxx是H5里面的方法名称 yyyyyyy 里面是H5方法里面相对于的一些参数
NSString *textJS = @”xxxx(‘yyyyyyy’)”;
[context evaluateScript:textJS];[/code]
以上就是对H5 和 app 相互交互的理解了,可以多加练习,就会逐渐理解了。
借鉴的文章地址:iOS下JS与原生OC互相调用(总结)