js与原生通讯机制

js与原生通讯在iOS6.0及以前,只能通过 UIWebView的UIWebViewDelegate协议

方法来做拦截,并在这个方法中,根据url来调用Objective-C方法

一.javascript调用Objective-C

方法1  直接改变当前页面的url 这种方法在电脑浏览器中会直接跳转,在手机中正常

javascript代码:

方法2 动态添加个iframe改变其地址 最后删除,这种方法不会使当前页面跳转 效果更佳

javascript代码:

Objective-C代码:

 

二.Objective-C调用javascript


(PS)如果你想去掉webview弹出的alert 中的来自XXX网页

 

方法来做拦截,并在这个方法中,根据url来调用Objective-C方法


但是iOS7之后, iOS 7 引入了 JavaScriptCore.framework库,它把 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的通信。

参考链接:



http://www.skyfox.org/javascript-ios-navive-message.html

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


方法来做拦截,并在这个方法中,根据url来调用Objective-C方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值