美文网首页重点html
浅谈JS与OC相互调用并传参(一)

浅谈JS与OC相互调用并传参(一)

作者: 名字太多不会起 | 来源:发表于2016-06-02 11:32 被阅读3218次

    前几天忙着微信支付,这几天刚刚抽出时间写一写之前在工作中研究的JS调用OC方法,还有就是OC给JS传值.我之前工作在APP中加入一个WebView,但是在APP中登录的同时也要在WebView中同时登陆,我们研究了一个方法就是把token/model/手机类型(iOS或Android)/ 同时在js中根据token是否为NULL,来调用APP的登录方法.

    JS与OC相互相互调用,我知道的是有三种方法

    1.WebViewJavascriptBridge(第三方) 2.WKWebView(据说以后要代替WebView) 3.JSExport(JavaScrptCore框架) 4.webView shouldStartLoadWithRequest:中截取JS传过来的URL调用方法并传值.
    **
    博主用的则是最后一种和"JSExport".先主要讲一下JSExport的用法吧.
    首先需求是,我要把我这边的token.model.和设备信息传给JS
    **


    **
    首先添加JavaScriptCore.framework框架
    **

    添加JavaScriptCore框架
    **
    导入头文件
    **
    import <JavaScriptCore/JavaScriptCore.h>
    **
    加载本地HTML
    **
        NSString *basePath = [[NSBundle mainBundle]bundlePath];
        NSString *helpHtmlPath = [basePath stringByAppendingPathComponent:@"GroupPay.html"];
        NSURL *url = [NSURL fileURLWithPath:helpHtmlPath];    
        [_webView loadRequest:[NSURLRequest requestWithURL:url]];
    

    **
    在 webViewDidFinishLoad:(UIWebView *)webView调用(前提要给webView加代理)
    **

    
    -(void)webViewDidFinishLoad:(UIWebView *)webView
    {
        
        if ([BNCUserDefault objectForKey:@"token"] == nil) {
            NSString *token = @"null";
            NSString *model = @"null";
            NSString *ios = @"ios";
            JSValue *picCallback = self.context[@"picCallback"];
            [picCallback callWithArguments:@[token,model,ios]];
        } else {
            NSString *token = [[NSUserDefaults standardUserDefaults] objectForKey:@"token"];
            NSString *model =[BNCUserDefault objectForKey:@"model"];
            NSString *ios = @"ios";
            JSValue *picCallback = self.context[@"picCallback"];
            [picCallback callWithArguments:@[token,model,ios]];
    
        }
    

    **
    在JS端是这样写的
    **

    
    
      
                     var picCallback = function(token,model,app) {
                         alert(token);
                         alert(model);
                         alert(app);
                    }
    

    **
    我们运行一下看一下效果
    **

    token的alert model的alert 设备信息

    **
    接下来我使用一种方法调用JS的方法并返回给参数
    **

    
    
    self.context[@"model"] = ^() {
            NSLog(@"调用model的方法");
            NSString *model =[BNCUserDefault objectForKey:@"model"];
           return model;
    }
    

    **
    在JS端我是这样写的
    **

            var a = model();
            alert(a);
            
    
    Paste_Image.png

    但这个也会有个问题:问题是这个在网页加载之后我们会把这个值传给JS,但是JS是要在加载网页过程中拿到这些值,所以在调用中往往会获得一个nil.然而这个问题困扰我好久,最后只能在JS端加了一个延迟加载,这个会对速度和用户体验会有影响的.好先写到这吧


    相关文章

      网友评论

      本文标题:浅谈JS与OC相互调用并传参(一)

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