欢迎使用CSDN-markdown编辑器

JS与Native交互浅识

本文将介绍iOS客户端UIWebView与JavaScript进行交互,实现数据传输,界面切换,控件显示等功能:

需求背景

客户端开发的优缺点:
优点: 交互流畅,交互性强,对于复杂手势和精彩动画的支持到位,可以给用户更好的交互体验.
缺点:开发成本高,上线时间长,可及时修改性差

Web开发的优缺点:
优点:灵活性高,上线不受苹果审核限制
缺点:与客户端原生控件相比,交互较差

交互方式

两个问题:
1.Native(UIWebView)能否直接调用JS方法?
YES
2.JS是否可以直接调用Native方法?
NO

Native调用JS方法
核心方法:
-(NSString*)stringByEvaluatingJavaScriptFromString:(NSString *)script;
使用该方法,等同于直接执行script语句

JS调用Native方法
核心技术:
JS通过触发UIWebViewshouldStartLoadWithRequest方法(修改src等方式),Native通过约定的方法进行重定向,客户端实现响应操作.常用的方法有以下两种
1.Native拦截URL,异步调用
2.Native注册协议,通过拦截canInitWithRequest,可以选择同步或者异步

简化操作

上述文中看出,交互难点在与JS调用Native方法,目前比较好的第三方类有UIWebViewJavaScriptBridge.

UIWebViewJavaScriptBridge

以UIWebView为载体,通过bridge沟通JS和Native.
使用方法:JS端和Native端,均实例化一个bridge对象,通过注册方法(registerHandler)和调用方法(callHandler)实现相互调用
想要调用方法,被调用者必须注册这个方法,保证方法名一直即可,然后在方法的回调内进行操作
交互说明图

Cordova

CordovaActivity:Cordova Activity入口,已实现PluginManager、WebView的相关初始化工作, 只需继承CordovaActivity实现自己的业务需求。
PluginManager: 插件管理器
ExposedJsApi :javascript调用Native, 通过插件管理器PluginManager 根据service找到具体实现类。
NativeToJsMessageQueue:Native调用javascript,主要包括三种方式:loadUrl 、 轮询、反射WebViewCore执行js

UIWebViewJavaScriptBridge的使用

原理分析
对bridge进一步封装,注册约定好的方法,并进行实现
举例:
实例化

[WebViewJavascriptBridge enableLogging];
self.bridge = [WebViewJavascriptBridge bridgeForWebView:webView webViewDelegate:self handler:^(id data, WVJBResponseCallback responseCallback) {

}];

注册方法

[self.bridge registerHandler:@"share" handler:^(id data, WVJBResponseCallback responseCallback) {
    NSLog(@"data--%@",data);
    [self share:data];
    responseCallback(@NO);
}];

调用JS方法

[self.bridge  callHandler:@"groupMessages" data:@"test" responseCallback:^(id responseData) {
        NSLog(@"groupMessages%@",responseData);
    }];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者FarWinter,源码IOS-JsAndNativeDemo,通过webview代理方法 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 当触发上面的js,webview会收到回调,用上面的代理方法来截获这个request的参数就可以做native需要做的事情。 这中方法比较的麻烦不够清晰,不推荐使用。 有个开源的第三方可以去看看。WebViewJavascriptBridge 从ios7开始苹果公布了JavaScriptCore.framework 这个系统库,用来解决JS与OC的交互。 说明: JavaScriptCore是封装了JavaScript和Objective-C桥接的Objective-C API,只需要较少的的代码,就可以实现JavaScript与Objective-C的相互调用。 iOS7之后苹果推出了JavaScriptCore这个框架,从而让web页面和本地原生应用交互起来非常方便,而且使用此框架可以做到Android那边和iOS相对统一,web前端写一套代码就可以适配客户端的两个平台,从而减少了web前端的工作量。 JavaScriptCore中web页面调用原生应用的方法可以用Delegate或Block两种方法。 JavaScriptCore中类及协议: JSContext:给JavaScript提供运行的上下文环境,JSContext是代表JS的执行环境,通过-evaluateScript:方法就可以执行一JS代码。 JSValue:JSValue封装了JS与ObjC中的对应的类型,以及调用JS的API等,可以理解为JavaScript和Objective-C数据和方法的桥梁。 JSManagedValue:管理数据和方法的类。 JSVirtualMachine:处理线程相关,使用较少。 JSExport:JSExport是一个协议,遵守此协议,就可以定义我们自己的协议,在协议中声明的API都会在JS中暴露出来,才能调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值