iOS中UIWebView与JS交互(JSContext)

一、原生调用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

发表评论