文章内容
一、原生调用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 |