zoukankan      html  css  js  c++  java
  • iOS7之后JavaScript与Objective-C之间的通信

    http://www.cocoachina.com/ios/20150906/13320.html


    最近公司用Ping++集成了第三方支付,并且微信端也集成了这个功能,而微信付款时需要调用原生的支付宝支付或者微信支付,由此引出了JS调用OC方法的问题。

    Js -> Native

    以前传统的做法是根据url字符串来做特殊匹配,从而完成一些特定的工作譬如

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        NSString *requestString = [[request URL] absoluteString];
        NSString *scheme = @"js-pingpp";
        NSString *protocol = [NSString stringWithFormat:@"%@://", scheme];
        if ([requestString hasPrefix:protocol]) {
            //调用相应支付Api
            /*do something*/
            return NO;
        }
        return YES;
    }

    但是iOS7之后, iOS 7 引入了 JavaScriptCore 库,它把 WebKit 的 JavaScript 引擎用 Objective-C 封装,让JavaScript与Objective-C之间的通信变的非常简单。首先导入JavaScriptCore.framework框架, 然后

    JS端:

    1
    TXBB_IOS_SDK.callPay(charge, this.success, this.cancel);

    OC端:

    .h中引入头文件,并实现协议和对应的方法
    55.png

    .m中在webViewDidFinishLoad中给context赋值,并把self指针给TXBB_IOS_SDK,JS端即可经过TXBB_IOS_SDK.callPay调用起Native方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    -(void)webViewDidFinishLoad:(UIWebView *)webView
    {
        self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
         
        self.context[@"TXBB_IOS_SDK"] = self;
    }
     
    #pragma mark - JSExport Methods
    - (void)callPay:(NSString *)charge success:(NSString *) success cancel:(NSString *)cancel {
        ...
        [Pingpp createPayment:charge appURLScheme:@"msc" withCompletion:completion];
    }

    Native -> Js

    OC端调用JS代码则只需通过context调用evaluateScript方法即可,下列代码即会用JS显示Hello World,而在iOS7.0之前你可能通过[webView stringByEvaluatingJavaScriptFromString:@"document.title"]方法来获取WebView的title。

    1
    2
    3
    4
    5
    6
    -(void)webViewDidFinishLoad:(UIWebView *)webView  
    {   
        JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];  
        NSString *alertJs=@"alert('Hello Word')"
        [context evaluateScript:alertJs];
    }

    最后

    JS和OC通信还有个非常著名的第三方库WebViewJavascriptBridge,如果你的项目需要支持iOS6之前的系统,你可以通过这个项目实现JS和OC的通信。

     
     
  • 相关阅读:
    Welcome-to-Swift-12附属脚本(Subscripts)
    Summarization of Tech Interviews
    How to Conduct High-Impact Research and Produce High-Quality Papers
    ZVAL——PHP源码分析
    个人使命
    习题-机器学习-西瓜书-周志华
    Machine Learning
    《踏踏实实学英语》读书笔记
    TF-IDF原理与实现
    线性代数学习感悟
  • 原文地址:https://www.cnblogs.com/itlover2013/p/4784733.html
Copyright © 2011-2022 走看看