美文网首页iOS开发收集iOS工具学习
OC与JS交互实际使用后的学习总结

OC与JS交互实际使用后的学习总结

作者: Ithran | 来源:发表于2016-03-13 15:05 被阅读531次

    公司接手了一个要和web前端交互的app项目,在这里就只是总结一下两端是怎么互相调用方法

    简述:

    iOS原生应用和web页面的交互大致上有这几种方法iOS7之后的JavaScriptCore拦截协议、第三方框架WebViewJavaScriptBridge、iOS8之后的WKWebView,在这里主要讲解JavaScriptCore这种办法。因为经过学习感觉JavaScriptCore使用起来是较为简单。而且更容易明白

    iOS

    iOS这边的方法名需要和前端沟通定好,因为我这边的前端也没有和App交互的经验,所以都是iOSAndroid定的方法名,为了前端的方法名统一,也为了减少前端的麻烦,web页面调用原生应用的方法可以用DelegateBlock两种方法。而我就说说Delegate方法

    JavaScriptCore的解释

    JSContext:JS运行的上下文环境
    JSValue:JSOC数据和方法交互的桥梁
    JSExport:添加了JSExport协议的协议,所规定的方法,变量等 就会对js开放

    VC里边的代码

    #import "ViewController.h"
    #import <JavaScriptCore/JavaScriptCore.h>
    
    @protocol JSObjcDelegate <JSExport>
    //这是一个普通的回调方法
     - (void)callTest;
    //这可以从web端返回内容的方法
     - (void)contentCallBack:(NSString *)content;
    @end
    
    @interface ViewController () <UIWebViewDelegate, JSObjcDelegate>
    @property (nonatomic, strong) JSContext *jsContext;
    @property (weak, nonatomic) IBOutlet UIWebView *webView;
    @end
    
    @implementation ViewController
    
    #pragma mark - Life Circle
    - (void)viewDidLoad
    { 
       [super viewDidLoad]; 
       NSURL *url = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"html"]; 
       [self.webView loadRequest:[[NSURLRequest alloc] initWithURL:url]];
    }
    
    #pragma mark - UIWebViewDelegate
    - (void)webViewDidFinishLoad:(UIWebView *)webView 
    {
       self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
       self.jsContext[@"Ithran"] = self; 
       self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
              context.exception = exceptionValue;
              NSLog(@"异常信息:%@", exceptionValue); 
        };
    }
    
    #pragma mark - JSObjcDelegate
    - (void)callTest
    {
       NSLog(@"callTest");
       //这会回调JS的“jSCallBack”方法
       JSValue *jSCallBack = self.jsContext[@"jSCallBack"]; 
       [picCallback callWithArguments:nil];
    
       //这会回调JS的“SendJSContentCallBack”并且传了"hello world"过去
       JSValue *sendJSContentCallBack = self.jsContext[@"sendJSContentCallBack"]; 
       [picCallback callWithArguments:@[@"hello world"]];
    }
    
    - (void)contentCallBack:(NSString *)content
    {
       NSLog(@"content:%@", content); 
    }
    @end
    

    VC代码的说明

    自定义的代理JSObjcDelegate遵循了<JSExport>之后,就能把定义在此协议里的方法暴露给web端,然后web端就可以通过此协议里的方法名与iOS端进行交互,而这里的运行先后顺序为:

    webView加载完之后,获取JS运行的上下文,即是上边代码的jsContext,然后添加桥梁的对象名为Ithran(注释:桥梁的对象名可以随便取名,不过最好就是和其他两端人员沟通好才取名),

    ②继承了webDelegate代理的webView就会运行JSObjcDelegate此代理里的方法

    ③然后继续调用JS里的方法,如这里的jSCallBacksendJSContentCallBack方法

    web前端

    web前端代码:
    注释:以下代码可以让web前端它写在需要触发这个方法的地方即可

    <script>
        var sendIOSContent = function(){
             var content = '我来自web前端';
             var contentStr = JSON.stringify({"content":content});
             try{
                 Ithran.sendJSContentCallBack(conetntStr);
             }catch(err){}
         }
    
         var jSCallBack = function(){
             try{
                 alert('jScallBack success');
             }catch(err){}
         }
    
         var sendJSContentCallBack = function(content){
             try{
                 alert(content);
             }catch(err){}
         }
    </script>
    

    web前端代码简单说明:
    这就给一些不太熟悉这段代码的同学讲解一下,web前端可以通过这里的sendIOSContentjSCallBacksendJSContentCallBack方法名来调用方法,Ithran就是之前在VC里定义的桥梁对象名,web前端通过桥梁对象名来回调我们在VC里定义的方法,而我们在VC里可以通过JSValue也可以调用到web前端定义的方法名(所以我感觉这和拦截协议有着大同小异的功能,虽然实质上是不同的),而这里的try{}catch(){}方法是判断方法成功运行就运行,失败就输出错误信息

    至此为止就完成了OC和JS的交互了

    我这里因为用JavaScriptCore就能解决我的交互问题,所以就不讲解其他的方法了,如果有兴趣的同学想学习其他的交互方式的话,我在下面提供一些参考和源代码的下载地址

    拦截

    拦截的方法参考地址

    WebViewJavaScriptBridge

    WebViewJavaScriptBridge就是通过封装拦截协议的第三方
    WebViewJavaScriptBridge源码 GitHub的地址

    WKWebView

    WKWebView源码 GitHub的地址

    如果有哪里描述错误了,也有请各位大大指正,谢谢

    相关文章

      网友评论

      • 小茗:请问作者可以留个QQ交流一下,想请教一下关于拦截请求那方面,网上找了很多资料都一头雾水

      本文标题:OC与JS交互实际使用后的学习总结

      本文链接:https://www.haomeiwen.com/subject/ftaxlttx.html