最近公司用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中引入頭文件,並實現協議和對應的方法this
.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的通訊。