Obj-C与javascript交互之WebViewJavascriptBridge

论坛 期权论坛 脚本     
匿名技术用户   2021-1-6 14:30   35   0

webview与js交互方式,调用js方法要在Obj-C中写js代码,这种方式非常臃肿,耦合性强。 WebViewJavascriptBridge框架就完美解决了webview的这缺点。

WebViewJavascriptBridge的原理也是通过webview的stringByEvaluatingJavaScriptFromString:方法调用JavaScript代码;JavaScript调用Obj-C,则是通过web view的代理方法shouldStartLoadWithRequest:来接收JavaScript的网络请求从而实现调用。

WebViewJavascriptBridge下载地址


WebViewJavascriptBridge的使用:

1、把WebViewJavascriptBridge文件夹导入到项目中。


2、引入头文件和声明属性。

[objc] view plain copy
  1. #import "WebViewJavascriptBridge.h"
  2. ...
  3. @property WebViewJavascriptBridge* bridge;


3、Obj-C和javascript实例化

3. 1、实例化WebViewJavascriptBridge。javascript发送的消息都在此处接收。

[objc] view plain copy
  1. //初始化WebViewJavascriptBridge
  2. _bridge = [WebViewJavascriptBridge bridgeForWebView:webView handler:^(id data, WVJBResponseCallback responseCallback) {
  3. NSLog(@"接收从javascript发送过来的信息: %@", data);//接受从js传过来的值
  4. responseCallback(@"oc影响信息"); //相应消息,发送到js
  5. }];



3.2 、javascript要和Obj-C交换,html/jsp 页面必须要声明方法并注册WebViewJavascriptBridgeReady监听。以下javascript代码是固定写法:

[javascript] view plain copy
  1. function connectWebViewJavascriptBridge(callback) {
  2. if (window.WebViewJavascriptBridge) {
  3. callback(WebViewJavascriptBridge);
  4. } else {
  5. document.addEventListener('WebViewJavascriptBridgeReady', function() {
  6. callback(WebViewJavascriptBridge);
  7. }, false);
  8. }
  9. }
  10. connectWebViewJavascriptBridge(function(bridge) {
  11. //.....此处写和oc交换的js代码
  12. });



3.3、javascript初始化WebViewJavascriptBridge. 这会调起 ‘WebViewJavascriptBridgeReady’ 的事件handler.Obj-C发送的消息都在此处接收。

[javascript] view plain copy
  1. connectWebViewJavascriptBridge(function(bridge) {
  2. /* <span style="color: rgb(37, 37, 37); font-family: Monaco; font-size: 11px;">初始化 </span>Init your app here */
  3. bridge.init(function(message, responseCallback) {
  4. alert("Javascript 接收从oc发送过来的信息: " + message);
  5. if (responseCallback) {
  6. responseCallback("javascript 响应信息")
  7. }
  8. });
  9. });


4、发送消息

4.1、Obj-C发送消息给javascript。

[objc] view plain copy
  1. //发送消息给javascript
  2. [_bridge send:@"OC发送一条信息给javascript"];

4.2、javascript发送消息给Obj-c。

[javascript] view plain copy
  1. bridge.send("javascript发送一条信息给OC");


5、Obj-c调用javascript。

5.1、javascript注册handler(用于被Obj-c获取该handler调用)

[javascript] view plain copy
  1. //注册一个叫做 testJavascriptHandler 的handler(用于被oc获取该handler调用)
  2. //data:接受oc传的数据 responseCallback:相应后返回的数据
  3. bridge.registerHandler("testJavascriptHandler", function(data, responseCallback) {
  4. alert("ObjC called testJavascriptHandler with:"+data);
  5. var responseData = { 'Javascript Says':'Javascript已响应!' }
  6. responseCallback(responseData)
  7. });

5.2、Obj-c调用javascript代码。

[objc] view plain copy
  1. //调用javascript叫做 testJavascriptHandler的handler. 在调用 handler成功后可以通过responseCallback block做出反应.
  2. [_bridge callHandler:@"testJavascriptHandler" data:@"我是oc传过来的" responseCallback:^(id responseData) {
  3. //responseData :Javascript相应后返回的消息
  4. NSLog(@"jJavascript Says:%@",responseData[@"Javascript Says"]);
  5. }];


6、javascript调用Obj-c

6.1、Obj-c注册handler(用于被javascript获取该handler调用)

[objc] view plain copy
  1. //注册一个叫做 testOCHandler 的handler
  2. [_bridge registerHandler:@"testOCHandler" handler:^(id data, WVJBResponseCallback responseCallback) {
  3. NSLog(@"testObjcCallback called: %@", data);
  4. responseCallback(@"Response from testOCCallback:oc已响应!");
  5. }];

6.2、javascript调用Obj-c代码。

[javascript] view plain copy
  1. //调用oc叫做 testOCHandler的handler
  2. bridge.callHandler("testOCHandler","我是javascript传过来的",function(response){
  3. //response:oc响应后返回的数据
  4. alert("oc响应后返回的数据:"+response);
  5. });


完整的Obj-c代码

[objc] view plain copy
  1. //
  2. // ViewController.m
  3. // WebViewJavascriptBridge
  4. //
  5. #import "ViewController.h"
  6. #import "WebViewJavascriptBridge.h"
  7. @interface ViewController ()
  8. @property WebViewJavascriptBridge *bridge;
  9. @end
  10. @implementation ViewController
  11. - (void)viewDidLoad {
  12. [super viewDidLoad];
  13. UIWebView *webView = [[UIWebView alloc] init];
  14. webView.frame = self.view.frame;
  15. [self.view addSubview:webView];
  16. NSURL *url = [NSURL URLWithString:@"http://localhost:8080/test/index.jsp"];
  17. NSURLRequest *rquest = [NSURLRequest requestWithURL:url];
  18. [webView loadRequest:rquest];
  19. //初始化WebViewJavascriptBridge
  20. _bridge = [WebViewJavascriptBridge bridgeForWebView:webView handler:^(id data, WVJBResponseCallback responseCallback) {
  21. NSLog(@"接收从javascript发送过来的信息: %@", data);//接受从js传过来的值
  22. responseCallback(@"oc影响信息"); //相应消息,发送到js
  23. }];
  24. //发送消息给javascript
  25. [_bridge send:@"OC发送一条信息给javascript"];
  26. //注册一个叫做 testOCHandler 的handler
  27. [_bridge registerHandler:@"testOCHandler" handler:^(id data, WVJBResponseCallback responseCallback) {
  28. NSLog(@"testObjcCallback called: %@", data);
  29. responseCallback(@"Response from testOCCallback:oc已响应!");
  30. }];
  31. //调用javascript叫做 testJavascriptHandler的handler. 在调用 handler成功后可以通过responseCallback block做出反应.
  32. [_bridge callHandler:@"testJavascriptHandler" data:@"我是oc传过来的" responseCallback:^(id responseData) {
  33. //responseData :Javascript相应后返回的消息
  34. NSLog(@"jJavascript Says:%@",responseData[@"Javascript Says"]);
  35. }];
  36. }
  37. @end


完整的jsp页面代码

[javascript] view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>My JSP 'index.jsp' starting page</title>
  11. <meta http-equiv="pragma" content="no-cache">
  12. <meta http-equiv="cache-control" content="no-cache">
  13. <meta http-equiv="expires" content="0">
  14. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  15. <meta http-equiv="description" content="This is my page">
  16. <!--
  17. <link rel="stylesheet" type="text/css" href="styles.css">
  18. -->
  19. </head>
  20. <script type="text/javascript">
  21. function connectWebViewJavascriptBridge(callback) {
  22. if (window.WebViewJavascriptBridge) {
  23. callback(WebViewJavascriptBridge);
  24. } else {
  25. document.addEventListener('WebViewJavascriptBridgeReady', function() {
  26. callback(WebViewJavascriptBridge);
  27. }, false);
  28. }
  29. }
  30. connectWebViewJavascriptBridge(function(bridge) {
  31. /* Init your app here */
  32. bridge.init(function(message, responseCallback) {
  33. alert("Javascript 接收从oc发送过来的信息: " + message);
  34. if (responseCallback) {
  35. responseCallback("javascript 响应信息")
  36. }
  37. });
  38. var sendMessage = document.getElementById("sendMessage");
  39. sendMessage.onclick = function(e){
  40. bridge.send("javascript发送一条信息给OC");
  41. }
  42. bridge.send("Please respond to this", function responseCallback(responseData) {
  43. //console.log("Javascript got its response", responseData)
  44. alert("Javascript 获取响应信息"+ responseData);
  45. })
  46. //注册一个叫做 testJavascriptHandler 的handler(用于被oc获取该handler调用)
  47. //data:接受oc传的数据 responseCallback:相应后返回的数据
  48. bridge.registerHandler("testJavascriptHandler", function(data, responseCallback) {
  49. alert("ObjC called testJavascriptHandler with:"+data);
  50. var responseData = { 'Javascript Says':'Javascript已响应!' }
  51. responseCallback(responseData)
  52. });
  53. var callbackButton = document.getElementById("buttons");
  54. callbackButton.onclick = function(e){
  55. e.preventDefault();
  56. //调用oc叫做 testOCHandler的handler
  57. bridge.callHandler("testOCHandler","我是javascript传过来的",function(response){
  58. //response:oc响应后返回的数据
  59. alert("oc响应后返回的数据:"+response);
  60. });
  61. }
  62. });
  63. </script>
  64. <body>
  65. <div id='buttons'>点击WKWebViewJavascriptBridge方法调用oc方法</div>
  66. <div id='sendMessage'>点击WKWebViewJavascriptBridge发送消息给oc</div>
  67. </body>
  68. </html>

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP