-
2021-12-30 15:46:04
更多方法交流可以家魏鑫:lixiaowu1129,一起探讨iOS相关技术!
需求分析:
最近项目需求需要麦克风录音权限,因为整体上的UI界面是前端wkwebview搭建的,实现功能逻辑是由iOS实现,没有用原生!然后就出现了需要麦克风录音机跟H5交互的功能模块!
查了资料都文章说iOS对h5交互麦克风录音不友好
现在具体工作流程步骤如下:- 首先创建了一个wkwebview
//加载webview视图 override func loadView() { let preference = WKPreferences() preference.minimumFontSize = 0 preference.javaScriptEnabled = true preference.javaScriptCanOpenWindowsAutomatically = true preference.setValue("TRUE", forKey: "allowFileAccessFromFileURLs") debugPrint("这里已经进来了") // swift 提供给 h5 调用方法 let userContentController = WKUserContentController() userContentController.add(self, name: "callAudio") //调起iOS音频权限
更多相关内容 -
iOS中WKWebView交互使用总结
2019-03-26 18:27:17前言 现在多数项目中会有使用webView的情况,过去往往使用UIWebView解决问题,但是由于其各种不便,给...WKWebView是继承自UIView的,因此构建方式还是很老套的,通常 - (instancetype)initWithFrame:(CGRect)fra...前言
现在多数项目中会有使用webView的情况,过去往往使用UIWebView解决问题,但是由于其各种不便,给开发者带来了很多麻烦。现在项目中有所使用,所以写一篇总结,方便以后用到了查找和使用也为了方便其他同行。
正文
基础使用
构建和配置
WKWebView是继承自UIView的,因此构建方式还是很老套的,通常
- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration
这个方法就够用了,第一个参数不多说,按照通常的使用就可以,第二个参数是对webView的配置对象,里面有很多属性可以使用,但是这里我只进行最简单使用的说明。
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc]init]; configuration.preferences.minimumFontSize = 10;//设置最小字体 configuration.preferences.javaScriptEnabled = YES;//是否可以使用JavaScript configuration.preferences.javaScriptCanOpenWindowsAutomatically = NO;//JS是否可以自动打开页面
以上配置就足够正常使用,其他的如果项目还有需要,请自己根据需要添加。
然后是对WKWebView的基本设置,self.webView.scrollView.bounces = NO; self.webView.navigationDelegate = self;
设置了取消弹性和代理,需要说明的是由于我们使用的是需要和JS进行交互的webView,所以需要在ViewController中声明两个代理WKNavigationDelegate,WKScriptMessageHandler,前者是用来处理webView加载视图的各种情况的,后者是主要用来处理交互事件的。
最后通过addSubView添加视图到父视图上面就可以了,这个时候应该是没有加载任何页面的webView。而主要功能加载web网页,需要使用以下方法:@property (nonatomic, strong) NSURLRequest *resetUrlRequest; self.resetUrlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"你所需要加载的网址"]];
当然考虑项目中可能会对网址进行拼接,如拼接token,因此强烈建议,将后面的URL构建部分挪到顶上分出来写。
基本代理相关
常用的有:
//开始加载 -(void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation //加载完成 -(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation //页面跳转失败 - (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error //加载报错,通常来说如果页面出现不存在等问题,会走这里,如果需要对空白页面进行处理,在这里处理 - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error //请求之前,决定是否要跳转:用户点击网页上的链接,需要打开新页面时,将先调用这个方法。 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { //允许页面跳转 // NSLog(@"%@=========tw============",navigationAction.request.URL); //如果是跳转一个新页面 if (navigationAction.targetFrame == nil) { [webView loadRequest:navigationAction.request]; } decisionHandler(WKNavigationActionPolicyAllow); } //接收到相应数据后,决定是否跳转 - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{ if (((NSHTTPURLResponse *)navigationResponse.response).statusCode == 200) { decisionHandler (WKNavigationResponsePolicyAllow); }else { decisionHandler(WKNavigationResponsePolicyCancel); } }
还有这些可能需要的
// 主机地址被重定向时调用 - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation; // 当内容开始返回时调用 - (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation; // 如果需要证书验证,与使用AFN进行HTTPS证书验证是一样的 - (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *__nullable credential))completionHandler; //9.0才能使用,web内容处理中断时会触发 - (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView NS_AVAILABLE(10_11, 9_0);
到此,基础的使用结束。
限制用户选择以及长按操作
有时候,我们会遇到一个比较头疼的问题,我们不想让用户长按选择或者有弹窗,那么这时我们需要添加两行代码来禁止这一系列行为。
//WKWebview 禁止长按(超链接、图片、文本...)弹出效果 [self.webView evaluateJavaScript:@"document.documentElement.style.webkitTouchCallout='none';" completionHandler:nil]; [self.webView evaluateJavaScript:@"document.documentElement.style.webkitUserSelect='none';" completionHandler:nil];
值得注意的是,这里其实是通过调用webView直接使用JS代码实现的操作,如果有需要还可以实现别的功能,而且这个方法最后有一个执行完毕之后的block,可以实现很多操作。
添加进度条
构建
@property (nonatomic, strong)UIProgressView *progressView; //添加进度条 self.progressView = [[UIProgressView alloc]initWithFrame:CGRectMake(0, 2, self.view.frame.size.width, self.view.frame.size.height)]; self.progressView.tintColor = UIColorWithRGB(254, 79, 109); [self.webView addSubview:self.progressView]; [self.webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
监听
#pragma mark - 进度条 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{ if ([keyPath isEqual:@"estimatedProgress"] && object == self.webView) { [self.progressView setAlpha:1.0f]; [self.progressView setProgress:self.webView.estimatedProgress animated:YES]; if (self.webView.estimatedProgress >= 1.0f) { [UIView animateWithDuration:0.3 delay:0.3 options:UIViewAnimationOptionCurveEaseOut animations:^{ [self.progressView setAlpha:0.0f]; } completion:^(BOOL finished) { [self.progressView setProgress:0.0f animated:YES]; self.progressView.hidden = YES; }]; } }else{ [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } }
代理中操作
-(void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{ self.progressView.hidden = NO; self.progressView.transform = CGAffineTransformMakeScale(1.0, 1.5); [self.view bringSubviewToFront:self.progressView]; // 将progress放到最前面 } -(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{ self.progressView.hidden = YES; self.title = self.webView.title; //WKWebview 禁止长按(超链接、图片、文本...)弹出效果 [self.webView evaluateJavaScript:@"document.documentElement.style.webkitTouchCallout='none';" completionHandler:nil]; // [self.webView evaluateJavaScript:@"document.documentElement.style.webkitUserSelect='none';" completionHandler:nil]; } - (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error{ NSLog(@"%@---------------",error); self.progressView.hidden = YES; } - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error{ NSLog(@"%@-------------------",error); //加载本地的一个空页面的操作 //[self sk_loadErrorPage]; }
返回上级以及popViewController
if ([[self.webView.backForwardList currentItem].title isEqualToString:@"首页"]) { [self.navigationController popViewControllerAnimated:YES]; } if ([self.webView canGoBack]) { //控制订单列表中的较多界面折回 if ([[self.webView.backForwardList currentItem].title isEqualToString:@"订单列表"] && [[self.webView.backForwardList backItem].title isEqualToString:@"订单列表"]) { [self.webView goToBackForwardListItem:[self.webView.backForwardList backList].firstObject]; }else{ [self.webView goBack]; } }else{ [self.navigationController popViewControllerAnimated:YES]; }
可以对H5页面的标题进行判断来决定是否跳转。
重点:JS交互
WKWebView的交互方法和之前的UIWebView其实本质上没有什么太大的差别,都是通过发送方法名找到对应的方法执行对应的操作。我的具体操作如下:
-(void)viewWillAppear:(BOOL)animated{ // self.navigationController.navigationBar.hidden = NO; if (self.webView) { if (self.webView.configuration.userContentController.userScripts.count>0) { //移除所有的监听 [self removeAllScriptMsgHandle]; } //对JS调用的方法进行监听,最好集中处理 [self.webView.configuration.userContentController addScriptMessageHandler:self name:@"mjxLogin"]; } } -(void)viewWillDisappear:(BOOL)animated{ [self removeAllScriptMsgHandle]; } - (void)dealloc{ //移除监听和代理 [self.webView removeObserver:self forKeyPath:@"estimatedProgress"]; [self.webView setNavigationDelegate:nil]; [self.webView setUIDelegate:nil]; } -(void)removeAllScriptMsgHandle{ //移除监听,不移除一定会报错 [self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"mjxLogin"]; }
对监听的处理的代理
//用来接收js调用本地方法的拦截器 -(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{ // NSLog(@"%@------mes------",message.body); //分享,多参数的情况 if ([message.name isEqualToString:@"mjxShare"]) { NSDictionary *messageDic = message.body; [self shareGoodsWithTitle:messageDic[@"title"] withContent:messageDic[@"content"] withUrl:messageDic[@"url"] withImage:messageDic[@"img"]]; } //申请试用,带一个参数的情况 if ([message.name isEqualToString:@"mjxApply"]) { NSDictionary *messageDic = message.body; [self requestApplyGoods:messageDic[@"trade_sn"]]; } //弹出错误信息 if ([message.name isEqualToString:@"errorAlert"]) { [SKHUD showErrorWithStatus:message.body]; } //保存二维码 if ([message.name isEqualToString:@"codeImg"]) { [SVProgressHUD show]; NSDictionary *messageDic = message.body; NSURL *url = [NSURL URLWithString:messageDic[@"codeImgUrl"]]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *img; img = [UIImage imageWithData:data]; UIImageWriteToSavedPhotosAlbum( img, self,@selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:) , NULL); } }
到此,相关使用全部结束,希望喜欢活有用的话,能够点赞或者评论支持,谢谢。
-
ios-JS wkWebView交互.zip
2019-07-11 19:09:46js调用swift的方法打开相机相册,压缩图片然后通过参数传给js方法 网页显示压缩后的图片 -
iOS JavaScriptCore 和 WKWebView交互
2017-03-23 10:56:07基于wkwebview的和JS 交互 遵守两个协议 < WKNavigationDelegate,WKScriptMessageHandler > WKWebViewConfiguration * configuration = [[ WKWebViewConfiguration alloc]init]; ...基于wkwebview的和JS 交互
遵守两个协议<WKNavigationDelegate,WKScriptMessageHandler>
WKWebViewConfiguration * configuration = [[WKWebViewConfiguration alloc]init]; userContentController =[[WKUserContentController alloc]init]; configuration.userContentController = userContentController; self=[super initWithFrame:CGRectZero configuration:configuration]; //注册 [userContentController addScriptMessageHandler:self name:@"cleanCatch"]; [userContentController addScriptMessageHandler:self name:@"testOcFun"];
由于和Js交互会导致内存泄漏,所以dealloc remove掉
-(void)dealloc{ //这里需要注意,前面增加过的方法一定要remove掉。 [userContentController removeScriptMessageHandlerForName:@"cleanCatch"]; [userContentController removeScriptMessageHandlerForName:@"testOcFun"]; }
JS 调用OC
//代理函数 -(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{ //window.webkit.messageHandlers.<message.name>.postMessage(<message.body>); NSLog(@"JS 调用OC"); NSLog(@"%@,%@",message.name,message.body); if([message.name isEqualToString:@"cleanCatch"]){ //清缓存 [self cleanCatcheAction]; }else if([message.name isEqualToString:@"testOcFun"]){ //测试 [self test]; } }
OC 调用JS 函数
-(void)test{ //调用方式: JS函数名(字符串参数) [self ocUseJsFunctionParms:@"OcCallJsfun2(\"{"ret":"success"}\")"]; } //OC调用Js -(void)ocUseJsFunctionParms:(NSString*)parms{ //@"方法名(\"参数\")" demo: NSString *jsStr = [NSString stringWithFormat:@"shareResult('%@','%@','%@')",title,content,url]; NSLog(@"OC 调用 JS"); //NSString*jsstr = [NSString stringWithFormat:@"cleanCatchFinish(\"%@\")",parms]; dispatch_async(dispatch_get_main_queue(), ^{ //OC 调用 JS [self evaluateJavaScript:parms completionHandler:^(id _Nullable result, NSError * _Nullable error) { if (error) { NSLog(@"出错:%@",error); }else{ NSLog(@"OC 调用JS 成功"); } }]; }); }
HTML网页,我是加载本地的
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <script type="text/javascript" src="jquery-3.2.0.min.js"></script> <script type="text/javascript"> function JsCallOC1() { window.webkit.messageHandlers.cleanCatch.postMessage(null); } function JsCallOC2() { window.webkit.messageHandlers.testOcFun.postMessage(null); } function OcCallJsfun2(parmss) { document.write("<p>"+JSON.stringify(parmss)+"</p>"); } function OcCallJsfun1() { alert('调用无参数的JS方法'); } </script> <style type="text/css"> #a{ color:red; } </style> <body bgcolor="aqua"> <button type="button" onclick="JsCallOC1()">调用无惨函数</button> <button type="button" onclick="JsCallOC2()">调用有参数函数</button> <a type="button" onclick="JsCallOC3()"id="tel">10086</a> </body> </html>
-
vue WKWebView 交互
2020-07-09 21:06:40重新整理一下网页与原生的交互 iOS Objective-c 懒加载个webview @interface ViewController ()<WKScriptMessageHandler> @property(nonatomic,strong) WKWebView *webView; @end -(WKWebView *)webView{ ...写在开始
目前AppStore提交已经彻底废弃UIWebView 以前一键接入的webjavascriptbridge也该放弃了
重新整理一下网页与原生的交互iOS Objective-c
懒加载个webview
@interface ViewController ()<WKScriptMessageHandler> @property(nonatomic,strong) WKWebView *webView; @end
-(WKWebView *)webView{ if (!_webView) { // 创建一个配置类 WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc]init]; WKUserContentController *userContentController = [[WKUserContentController alloc]init]; // 监听js调用 具体调用方式在js端 // 需要实现WKScriptMessageHandler 中方法 在下文↓ [userContentController addScriptMessageHandler:self name:@"jsCallNative"]; configuration.userContentController = userContentController; _webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration]; _webView.navigationDelegate = self; _webView.scrollView.bounces = NO; [_webView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1]]; } return _webView; }
实现WKScriptMessageHandler userContentController 监听js调用
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{ // 登陆保存token if ([message.name isEqualToString:@"jsCallNative"]) { // data is message.body } }
调用js中的方法
[self.webView evaluateJavaScript:[NSString stringWithFormat: @"nativeCallJS(%@)" ,[params JSONString] ]completionHandler:^(id _Nullable result, NSError * _Nullable error) { NSLog(@"调用js返回%@",result); }];
js
前端用的vue 大同小异
监听原生的调用
export default{ ... created(){ window.nativeCallJS = this.nativeCallJS }, methods:{ nativeCallJS:function(data){ return "return data" + data } } ... }
调用原生的方法
window.webkit.messageHandlers.jsCallNative.postMessage(params)
代码中无聊的地方太多 只是找些关键的贴出来 可能有错字 你说气不气
-
iOS开发教程之WKWebView与JS的交互
2020-08-25 21:08:20主要给大家介绍了关于iOS开发教程之WKWebView与JS的交互的相关资料,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 -
WKWebView、WebView和JS的交互方式详解
2021-01-20 10:27:58由于Xcode8发布之后,编译器开始不支持iOS 7了,这样我们的app也改为最低支持iOS 8.0,既然需要与web交互,那自然也就选择使用了 iOS 8.0之后 才推出的新控件 WKWebView. 相比与 UIWebView, WKWebView 存在很多优势... -
UIWebView转WKWebView交互方法统一解决办法
2020-06-22 11:57:59虽然中途也一直寻思着升级到WKWebView,但奈何项目中业务众多又是分布式的,和js交互的地方也很多,而WKWebView和UIWebView的交互方法写法又不一样,前端得区分是Android还是iOS,所有有交互的地 -
H5 js与iOS WKWebView交互
2021-06-18 10:18:28WKWebView的优势1 更多的支持HTML5的特性2 官方宣称的高达60fps的滚动刷新率以及内置手势3 将UIWebViewDelegate与UIWebView拆分成了14类与3个协议,以前很多不方便实现 的功能得以实现4 Safari相同的JavaScript引擎5 ... -
JS交互点击WKWebView中的图片实现预览效果
2020-10-18 20:03:39主要介绍了JS交互点击WKWebView中的图片实现预览效果,需要的朋友可以参考下 -
iOS WKWebview与JS交互
2021-12-08 11:04:51在APP开发中,调用H5极验功能涉及到原生与JS 交互,我用的是系统原生的方式实现,下面记录下实现步骤。 (仅涉及iOS端工作流程记录) 【OC版本:】 @interface ViewController ()<WKUIDelegate,WKNavigationDelegate... -
移动开发平台 mPaaS iOS端原生与WKWebView交互原理(如何打印蚂蚁框架所有原生与h5交互数据)
2021-02-20 09:11:31mPaaS使用的就是系统提供的最原始的交互方式,包括 WKWebView调用原生 和 原生调用WKWebView WKWebView调用原生 调用原生就找这个方法- (void)userContentController:(WKUserContentController *)... -
swift4 - wkwebview交互
2017-12-22 10:43:38WKWebView用法介绍本文swift与WKWebView交互Demo地址前言:苹果在iOS8中推出了webkit新框架,提供了WKWebview组件用来替换存在各种问题的UIWebview,用WKWebview加载网页,相较于UIWebview速度更快了,内存占用更少了... -
WKWebView与H5交互的两种方式
2018-09-21 11:10:06交互方式一:原生交互(以WKWebView为栗子) 1.原生调用H5方法 [wkWebView evaluateJavaScript:@"js方法名" completionHandler:^(id _Nullable response, NSError * _Nullable error) { if (!error) { //... -
iOS WKWebView交互实现及iOS13以上, iOS11以下适配
2020-04-09 18:05:52以下简单列出WKWebView的使用及注意事项. 初始化webview及事件监听 fileprivate lazy var webView: WKWebView = { let webConfiguration = WKWebViewConfiguration() webConfiguration.preferences = WKP... -
一分钟学会swift里WKWebView与javaScript的简单交互
2022-01-05 15:26:28一分钟学会swift里WKWebView与javaScript的简单交互 -
WKWebView与H5交互坑
2019-07-22 10:17:56由于项目中使用的一直都是UIWebView遇到了性能问题,...无奈只能使用WKWebView。 需要使用到的是WKScriptMessageHandler: WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; [co... -
iOS WKwebView和js交互
2019-04-10 10:46:47在交互中,关于alert (单对话框)函数、confirm(yes/no对话框)函数、prompt(输入型对话框)函数时,实现代理协议 WKUIDelegate ,则系统方法里有三个对应的协议方法.大家可以进入WKUIDelegate 协议类里面查看.下面具体... -
ios与H5通过WKWebView交互详解
2018-05-25 18:15:34WK的基本用法先不说了,主要在这里记录一下使用WKWebView在于H5交互时走过的一些坑,以及如果web端的同学如果没有做过和ios端的交互,那么自己也可以去帮助web端去完成;另外在调试过程中,也不用一味的去等待和H5去联调,... -
js与oc原生WKWebView交互传值
2018-08-15 17:29:31最近在做移动端实现H5支付,需要与JS交互,实现状态提醒,...先看下四中交互方式:(我用的第三种,现在都是在用wkwebview不建议用webview) 1.拦截网址(适用于UIWebView和WKWebView) 2.JavaScriptCore(只适用... -
WKWebView与js交互之完美解决方案
2017-04-04 19:09:43随着H5功能愈发的强大,没进行过混合开发的小伙们都不好意思说自己能够独立进行iOS的app开发,在iOS7操作系统下,常用的native,js交互框架有easy-js,WebViewJavascriptBridge,以及结合javaScriptCore的框架。... -
IOS 仿微信二维码/条形码扫描js与WKwebview交互调取二维码扫描
2020-09-09 10:49:14h5 js调用ios方法,请参考之前的文档 //JS调用OC 添加处理脚本 //ScriptMessageHandler [userContentController addScriptMessageHandler:self name:@"CallScanCodeHandler"]; #pragma mark - ... -
js 与WKWebView 交互
2019-03-25 07:39:24实现delegate WKUIDelegate,WKNavigationDelegate,WKScriptMessageHandler ...注入要和js交互的方法 WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; WKUserContentControll... -
WKWebview和iOS交互篇
2019-10-31 11:18:08WKWebview和iOS交互篇 ##iOS调用js 在UIWebview的时候使用JSContext来进行js通信,在WKWebview的时候,没有JSContext了,但是Apple提供了新的方法evaluateScript,使用起来更便捷。 [self.webview ... -
浅谈WKWebView使用、JS的交互
2021-01-21 10:56:02WKWebView是iOS8 出来的浏览器控件,用来取代UIWebView.对于WKWebView与UIWebView的对比特点,这里就不过多的叙述,都算是老生常谈的问题了,网上的说明也很多.近来在做Web端,需要植入移动端,并且做JS交互工作.以前写过... -
iOS使用WKWebView与JS的交互
2020-05-20 14:01:32WKWebView是iOS8 出来的浏览器控件,用来取代UIWebView 现在2020年 苹果已经不建议使用UIWebView了,所以需要把原来用到的换成WKWebView 本篇文章主要作用是实现JS调用OC,并且OC可以给到回调 WKJSBridge gitHub地址 ... -
iOS 边学边记 WKWebView与js交互详解
2020-11-20 08:49:48iOS下OC与JS的交互(WKWebview-MessageHandler实现) 在开发过程中,iOS 中实现加载 web 页面主要有两种控件,UIWebView 和 WKWebview,两种控件对应具体的实现方法不同。 现在苹果公司已经不允许使用webview的app上架... -
iOS常用方法——WKWebView与h5交互的实现
2018-07-03 15:44:57随着前端开发的强大,原生与h5的交互用的也越来越多。 为什么选用WKWebView,我们可以做一个对比,同一个web页面,用UIWebView加载和用WKWebView来加载,内存占用情况...UIWebView与h5的交互方式和WKWebView与h5的...