iOS中UIWebView与JS交互(JSContext)

一、原生调用JS

1
2
3
4
5
6
7
// 有两种方式。jsContext 是一个【JSContext *】变量,需要在【webViewDidFinishLoad: 】方法中每次赋值
// 方式1:
[self.jsContext evaluateScript:@"showResponse('点击了按钮1')"];
 
// 方式2:
JSValue *value = self.jsContext[@"showResponse"];
[value callWithArguments:@[@"点击了按钮2"]];

二、JS调用原生

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 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

发表评论

欢迎阅读『iOS中UIWebView与JS交互(JSContext)|APP设计、iOS、JavaScript|Nick Tan-梓潼Blog』