從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;