JS 交互

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

Js -> Nativeweb

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

- (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框架, 而后app

JS端:框架

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

OC端:微信支付

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

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

-(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 -> Jsurl

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

-(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的通讯。