iOS原生与H5交互方法

打印 上一主题 下一主题

主题 757|帖子 757|积分 2271

UIWebView

Objective-C 调用 JavaScript

在使用UIWebView时,可以使用stringByEvaluatingJavaScriptFromString:方法来执行JavaScript代码。
示例代码:

  1. NSString *result = [webView stringByEvaluatingJavaScriptFromString:@"returnFunction()"];
  2. NSLog(@"JavaScript返回值: %@", result);
复制代码
JavaScript 调用 Objective-C

通过自界说URL scheme实现。
使用webView的一个返回BOOL类型的监听网页的代理:shouldStartLoadWithRequest,在JS中,window.location.href = “hhh://callback”
在监听中监听头,然后把反面的string截取出来,用SEL变为函数名,然后调用
当在JavaScript中必要调用Objective-C代码时,可以通过改变window.location来触发Objective-C中的代理方法。
示例代码:

在Objective-C中,你可以在UIWebViewDelegate的webView:shouldStartLoadWithRequest:navigationType:方法中捕获这些请求:
  1. - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
  2.     NSURL *URL = [request URL];
  3.     if ([[URL scheme] isEqualToString:@"hhh"]) {
  4.         NSString *functionName = [URL host]; // 获取"callback"
  5.         SEL selector = NSSelectorFromString([functionName stringByAppendingString:@":"]);
  6.         if ([self respondsToSelector:selector]) {
  7.             [self performSelector:selector withObject:nil afterDelay:0];
  8.         }
  9.         return NO;
  10.     }
  11.     return YES;
  12. }
复制代码
在JavaScript中,你可以如许触发Objective-C代码:
  1. window.location.href = "hhh://callback";
复制代码
发起使用更安全的方式

固然上述方法可行,但自界说URL scheme方法可能导致安全题目,比方,可能会被恶意使用执行未授权的方法。因此,推荐使用更安全和现代的方法如WKWebView的WKScriptMessageHandler进行Native和JavaScript的交互。
   留意:UIWebView已经被苹果于弃用,使用会造成审核不通过,推荐使用WKWebView
  
WKWebView

1. JavaScriptCore

JavaScriptCore是一个JavaScript引擎,提供了与JavaScript上下文(context)的接口,可以用来执行JavaScript代码和访问JavaScript对象。JavaScriptCore封装了一些基础的JavaScript对象,如Date、Array等,并答应你界说自己的对象和函数。
原生调用H5

在Objective-C代码中执行你必要的JavaScript代码。
示例代码:
  1. JSContext *context = [[JSContext alloc] init];
  2. // 执行JavaScript
  3. [context evaluateScript:@"your javascript code here"];
复制代码
H5调用原生

在Objective-C中,可以通过context[@"functionName"]来注册一个可以被JavaScript调用的方法。
示例代码:
  1. JSContext *context = [[JSContext alloc] init];
  2. // 定义Objective-C block
  3. context[@"log"] = ^(NSString *msg) {
  4.     NSLog(@"JS: %@", msg);
  5. };
复制代码
然后在你的JavaScript代码中调用该方法:
  1. log('Hello from JavaScript');
复制代码
2. evaluateJavaScript和WKScriptMessageHandler

   evaluate:评价,评估,估值
  evaluateJavaScript:实现原生调用H5

使用WKWebView的evaluateJavaScript方法调用JavaScript代码,并从中获取效果。
示例代码:

在Objective-C中通过WKWebView调用JavaScript:
  1. #import <WebKit/WebKit.h>
  2. // 假设self.webView是你的WKWebView实例
  3. WKWebView *webView = [[WKWebView alloc] init];
  4. // JavaScript代码字符串
  5. NSString *script = @"document.title";
  6. // 执行JavaScript
  7. [webView evaluateJavaScript:script completionHandler:^(id _Nullable result, NSError * _Nullable error) {
  8.     if (error) {
  9.         NSLog(@"JavaScript执行错误: %@", error);
  10.         return;
  11.     }
  12.     NSLog(@"页面标题: %@", result);
  13. }];
复制代码
WKScriptMessageHandler:实现H5调用原生

WKWebView提供了更现代和功能更强盛的接口来与JavaScript交互。evaluateJavaScript:completionHandler:方法可以执行JavaScript代码,并通过回调接收效果。你也可以使用WKScriptMessageHandler创建一个消息处置惩罚器,当JavaScript通过window.webkit.messageHandlers.YourHandler.postMessage(data)发送消息时,你可以在Objective-C的userContentController:didReceiveScriptMessage:方法中接收到。
起首在Objective-C中创建消息处置惩罚器:
  1. // 在didFinishNavigation代理方法中添加JS调用OC的方法
  2. - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
  3.         // 注册一个name为hello的js方法
  4.         [webView.configuration.userContentController addScriptMessageHandler:self name:@"hello"];
  5. }
  6. //实现WKScriptMessageHandler此代理,然后在网页端通过window.webkit.messageHandlers.hello.postMessage({body: 'test'});即可调用
  7. - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
  8.     NSLog(@"body: %@", message.body);
  9. }
复制代码
以上就是使用
evaluateJavaScript 来实现原生调用H5
WKScriptMessageHandler 来实现H5调用原生
3. WKWebViewJavascriptBridge

WKWebViewJavascriptBridge是一个流行的开源库,用于在iOS应用中的WKWebView和HTML页面之间进行JavaScript与Objective-C或Swift代码的交互。它提供了一个简化的接口来发送消息和调用函数,使得原生代码和Web代码之间的通信更加便捷。
WKWebViewJavascriptBridge不完全属于之条件到的三种方法,它实际上是基于WKWebView的WKScriptMessageHandler封装而成的一个桥接工具,但它提供了更加高级和易用的API。
示例代码:

起首,项目中安装WKWebViewJavascriptBridge,通常通过CocoaPods安装:
  1. pod 'WKWebViewJavascriptBridge', '~> 1.0.0'
复制代码
然后,可以在你的Objective-C代码中如许使用它:
  1. #import <WebKit/WebKit.h>
  2. #import "WKWebViewJavascriptBridge.h"
  3. @interface ViewController ()
  4. @property (nonatomic, strong) WKWebView *webView;
  5. @property (nonatomic, strong) WKWebViewJavascriptBridge *bridge;
  6. @end
  7. @implementation ViewController
  8. - (void)viewDidLoad {
  9.     [super viewDidLoad];
  10.     // 设置WebView
  11.     self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
  12.     [self.view addSubview:self.webView];
  13.     // 初始化bridge
  14.     self.bridge = [WKWebViewJavascriptBridge bridgeForWebView:self.webView];
  15.     [self.bridge setWebViewDelegate:self];
  16.     // 注册一个供JS调用的方法
  17.     [self.bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
  18.         NSLog(@"testObjcCallback called: %@", data);
  19.         responseCallback(@"Response from testObjcCallback");
  20.     }];
  21.     // 调用JS的方法
  22.     [self.bridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }];
  23.     // 加载页面
  24.     NSURL *url = [NSURL URLWithString:@"https://example.com"];
  25.     [self.webView loadRequest:[NSURLRequest requestWithURL:url]];
  26. }
  27. @end
复制代码
在你的HTML/JavaScript中,你也必要设置对应的处置惩罚函数和调用:
  1. // Connect to the Objective-C bridge
  2. document.addEventListener('DOMContentLoaded', function() {
  3.     window.WebViewJavascriptBridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
  4.         console.log("ObjC called testJavascriptHandler with", data);
  5.         var responseData = { 'Javascript Says':'Right back atcha!' };
  6.         responseCallback(responseData);
  7.     });
  8. });
复制代码
如许,就设置了一个双向通信的桥,可以从JavaScript调用Objective-C代码,也可以从Objective-C调用JavaScript代码。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表