iOS7之后JavaScript與Objective-C之間的通信

jopen 9年前發布 | 15K 次閱讀 iOS7 iOS開發 移動開發

 作者:時乃天道


最近公司用Ping++集成了第三方支付,并且微信端也集成了這個功能,而微信付款時需要調用原生的支付寶支付或者微信支付,由此引出了JS調用OC方法的問題。

Js -> Native

以前傳統的做法是根據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框架, 然后

JS端:

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

OC端:

.h中引入頭文件,并實現協議和對應的方法
iOS7之后JavaScript與Objective-C之間的通信

.m中在webViewDidFinishLoad中給context賦值,并把self指針給TXBB_IOS_SDK,JS端即可經過TXBB_IOS_SDK.callPay調用起Native方法

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

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

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!