文章内容
一、原生调用JS
// 有两种方式。jsContext 是一个【JSContext *】变量,需要在【webViewDidFinishLoad: 】方法中每次赋值
// 方式1:
[self.jsContext evaluateScript:@"showResponse('点击了按钮1')"];
// 方式2:
JSValue *value = self.jsContext[@"showResponse"];
[value callWithArguments:@[@"点击了按钮2"]];
二、JS调用原生
// JS端,app是iOS中注册的一个对象
app.login("111", "222");
// iOS端
// 每次嵌入页面加载完毕都要给jsContext赋值,否则在js端调用可能会失效。
- (void)webViewDidFinishLoad:(UIWebView *)webView {
self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exception) {
context.exception = exception;
NSLog(@"异常信息:%@", exception);
};
// app是随便取的名字,可以改,改了之后JS要同步修改。如果Android端使用@JavaScriptInterface的形式,那么还要保证Android、iOS两端同步,建议都用app
self.jsContext[@"app"] = [[JSContextModel alloc] init];
}
// JSContextModel,
@protocol JsContextExport<JSExport>
/**
* 登出方法,js调用的方法名也是logout
*/- (void)logout;
/**
* 登录方法,JSExportAs的作用就是给OC方法导出一个js方法名,例如下面的方法js调用就是 login("your account", "your password")。在多参数的方法声明时必须使用这种方式
*/JSExportAs(login, - (void)loginWithAccount:(NSString *)account password:(NSString *)password);
/**
* 获取登录信息
* @return 当前登录用户的身份信息。JSContext方式调用OC时,方法的返回值只能是NSString、NSArray、NSDictionary、NSNumber、BooL,其他类型不能解析
*/- (NSDictionary *)getLoginUser;
@end
@interface JSContextModel : NSObject<JsContextExport>
@end