从iOS7之后,苹果公司就提供JavaScriptCore.framework开发库,用于支持H5与Native的交互。最近研究一下,网络上也有很多的开发用于支持UIWebView与H5的交互的开发库,例如:WebViewJavaScriptBridge。还有一个关于JS与Native交互的开发库:JSPatch;在这里不对他们做阐述,我主要阐述一下“H5代码如何与上层的Native交互”。
主要就是采用JavaScriptCore.framework,关于这个开发库的使用,大家可以百度一下。
直接上代码吧:
//
// WebViewJSPatch.m
// CommonProject
//
// Created by wuyoujian on 16/6/30.
// Copyright © 2016年 wuyoujian. All rights reserved.
//
#import "WebViewJSPatch.h"
static NSString *const jsContextKeyPath =@"documentView.webView.mainFrame.javaScriptContext";
@implementation WebViewJSPatch
/**
* 向webview中注册js调用Native的api
* @param webView 对应的WebView
* @param apiName 对应的js的function名称
* @param apiBlock 对应的Native的实现block
*/
+ (void)registNativeAPIInWebView:(UIWebView*)webView apiName:(NSString*)apiName apiBlock:(WebViewJSPatchBlock)apiBlock {
JSContext *context = [webViewvalueForKeyPath:jsContextKeyPath];
if (context && [contextisKindOfClass:[JSContextclass]]) {
context[apiName] = ^() {
NSArray *args = [JSContextcurrentArguments];
for (JSValue *jsValin args) { NSLog(@"%@", jsVal.toString);}
dispatch_async(dispatch_get_main_queue(), ^{
//
if (apiBlock) {
apiBlock(args);
}
});
};
}
}
/**
* 在webView中执行js
* @param webView 对应的WebView
* @param script 需要执行的js代码
*/
+ (JSValue*)evaluateScriptWebView:(UIWebView*)webView script:(NSString*)script {
JSContext *context = [webViewvalueForKeyPath:jsContextKeyPath];
if (context && [contextisKindOfClass:[JSContextclass]]) {
return [contextevaluateScript:script];
}
returnnil;
}
@end
使用方法:
1、js调用Native(即H5调用Native API)
可以直接在UIWebView初始化完成之后,调用WebViewJSPatch类方法registNativeAPIInWebView注册js需要调用的Native的方法,本质上是注册一个block;
2、Native调用js
这个有两种方式,UIWebView本身提供:stringByEvaluatingJavaScriptFromString 方法,在这里我们采用JSContext方式来调用js;