iOS8以后,Apple公司推出了WKWebView,对比之前的UIWebView不论是处理速度还是内存性能,都有了大幅度的提升!

那么下面我就分享一下WKWebView与JS的交互.

首先使用WKWebView.你需要导入WebKit #import

然后初始化一个WKWebView,设置代理,并且执行代理的方法.在网页加载成功的时候,我们会调用一些JS代码对网页进行设置.

WKWebView的代理一共有三个:WKUIDelegate,WKNavigationDelegate,WKScriptMessageHandler

1.WKWebView调用JS方法

/**     iOS调用js里的navButtonAction方法并传入两个参数     @param 'Xuanhe' 传入的参数     @param 25 传入的参数     @return completionHandler 回调     */ [self.webView evaluateJavaScript:@"navButtonAction('Xuanhe',18)" completionHandler:^(id _Nullable response, NSError * _Nullable error) {NSLog(@"response:%@,error:%@",response,error); }];

网页加载完成

//网页加载完成-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{//设置JSNSString *js = @"document.getElementsByTagName('h1')[0].innerText";//执行JS    [webView evaluateJavaScript:js completionHandler:^(id _Nullable response, NSError * _Nullable error) {NSLog(@"value: %@ error: %@", response, error);    }];}

通过以上操作就成功获取到h1标签的文本内容了.如果报错,可以通过error进行相应的错误处理.

2.加载JS代码

创建WKWebView,并在创建时向JS写入内容.

WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, kNavBarH, kScreenW, kScreenH-kNavBarH) configuration:config];webView.navigationDelegate = self;webView.UIDelegate = self;//获取HTML上下文的第一个h2标签,并写入内容 NSString *js = @"document.getElementsByTagName('h2')[0].innerText = '这是一个iOS写入的方法'";WKUserScript*script = [[WKUserScript alloc] initWithSource:js injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];[config.userContentController addUserScript:script];[self.view addSubview:webView];

调用JS方法:

 [[webView configuration].userContentController addScriptMessageHandler:self name:@"show"];

遵循代理WKScriptMessageHandler后,调用JS的方法show;

实现WKScriptMessageHandler代理方法,调用JS方法后的回调,可以获取到方法名,以及传递的数据:

//js传递过来的数据-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{NSLog(@"%@",message.name);//方法名NSLog(@"%@",message.body);//传递的数据}

获取JS弹窗信息

遵循WKUIDelegate代理,实现相关代理方法:

// alert//此方法作为js的alert方法接口的实现,默认弹出窗口应该只有提示信息及一个确认按钮,当然可以添加更多按钮以及其他内容,但是并不会起到什么作用//点击确认按钮的相应事件需要执行completionHandler,这样js才能继续执行参数 message为  js 方法 alert() 中的-(void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];    [alertController addAction:([UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {        completionHandler();    }])];    [self presentViewController:alertController animated:YES completion:nil];}// confirm//作为js中confirm接口的实现,需要有提示信息以及两个相应事件, 确认及取消,并且在completionHandler中回传相应结果,确认返回YES, 取消返回NO//参数 message为  js 方法 confirm() 中的-(void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];    [alertController addAction:([UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {        completionHandler(NO);    }])];    [alertController addAction:([UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {        completionHandler(YES);    }])];    [self presentViewController:alertController animated:YES completion:nil];}// prompt//作为js中prompt接口的实现,默认需要有一个输入框一个按钮,点击确认按钮回传输入值//当然可以添加多个按钮以及多个输入框,不过completionHandler只有一个参数,如果有多个输入框,需要将多个输入框中的值通过某种方式拼接成一个字符串回传,js接收到之后再做处理//参数 prompt 为 prompt(, );中的//参数defaultText 为 prompt(, );中的 -(void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler{UIAlertController *alertController = [UIAlertController alertControllerWithTitle:prompt message:@"" preferredStyle:UIAlertControllerStyleAlert];    [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {        textField.text = defaultText;    }];    [alertController addAction:([UIAlertAction actionWithTitle:@"完成" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {        completionHandler(alertController.textFields[0].text?:@"");    }])];    [self presentViewController:alertController animated:YES completion:nil];}

demo地址

作者:iOS_xuanhe

链接:https://www.jianshu.com/p/10ee497d905f

本公众号转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系本公众号进行修改或删除【联系方式QQ : 3442093904  邮箱:support@cocoachina.com】。文章内容为作者独立观点,不代表本公众号立场。版权归原作者所有,如申请授权请联系作者,因文章侵权本公众号不承担任何法律及连带责任。

---END---

ios 使用webview 查找_iOS开发WKWebView与JS的交互相关推荐

  1. ios 使用webview 查找_ios: WebView内高亮搜索

    由于webview 加载的是网页 只能用js 进行页内查找  废话不说上代码 //注入 JS 查找 NSString *resPath =[[NSBundle mainBundle] resource ...

  2. 在UAP中如何通过WebView控件进行C#与JS的交互

    原文:在UAP中如何通过WebView控件进行C#与JS的交互 最近由于项目需求,需要利用C#在UWP中与JS进行交互,由于还没有什么实战经验,所有就现在网上百度了一下,但是百度的结果显示大部分都是在 ...

  3. ios 判断数字大小_iOS开发积累2

    3.设备的CPU架构简介 模拟器: 4s~5 : i386 5s~6plus : x86_64 真机: 3gs~4s : armv7 5~5c : armv7s (静态库只要支持了armv7,就可以跑 ...

  4. ios 取设备语言_iOS开发:获取手机等设备当前的语言和地区的方法

    在iOS开发过程,尤其是开发有需要做国际化的项目的时候,如果需要做本地语言国际化,需要获取到手机本地语言设置,然后向服务器请求数据的时候,需要把获取到的手机本地语言参数传给后台,然后后台根据具体的语言 ...

  5. ios wkweb设置图片_iOS 之 WKWebView自适应高度获取网络图片

    WKWebView是iOS8中引入的新组建,苹果将 UIWebViewDelegate 与 UIWebView 重构成了14个类和3个协议并引入了不少新的功能和接口,它代替了UIKit 中的 UIWe ...

  6. ios支付 选择货币_iOS开发中金钱货币的计算问题

    ios开发中涉及到和货币价格计算相关的,都需要注意计算精度的问题. 服务器有可能返回的金钱是int float double string NSNumber, 单纯的float.double的计算都会 ...

  7. ios 裁剪圆形头像_iOS开发笔记:实现圆形头像

    初学iOS,记录一下自己遇到的一些问题,也希望能够对别人有所帮助 一般应用的个人头像如上图,圆形头像算是每款App中最常见的东西了,刚好最近有遇到这个问题,并且顺利解决了,其实很简单,调用layer这 ...

  8. ios 后台唤醒应用_IOS开发之----详解在IOS后台执行

    文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以, 1.音乐 2.location 3.voip 文 ...

  9. ios 裁剪圆形头像_iOS开发之裁剪圆形头像

    - (void)viewDidLoad { [super viewDidLoad]; //加载图片 UIImage *image = [UIImage imageNamed:@"菲哥&quo ...

最新文章

  1. 【武书连】2021 中国一流大学名单(30 所)和中国大学综合实力 700 强出炉!
  2. (树上启发式合并)CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
  3. mysql alter engine_MySQL_mysql下修改engine引擎的方法,修改my.ini,在[mysqld]下加上 - phpStudy...
  4. vs界面竖线光标变成灰色方块,输入时替代已有字符
  5. 笔记:写Java程序,并输出
  6. java filechannel 空_FileChannel的基本操作
  7. linux测试dvi接口,液晶显示器DVI接口及测试规范.pdf
  8. git中文件的三种状态
  9. Batch Normalization的一些缺陷
  10. PKI/CA与数字证书
  11. idea java web mysql_JavaWeb 开发环境配置 — 基于IDEA 2019.2
  12. voms下的反射大师_晓星说数学:让数学家折服的艺术大师埃舍尔
  13. MySQL服务端恶意读取客户端文件漏洞 (DDCTF2019和国赛均涉及到这个漏洞)
  14. 田汉卿 | 量化基金怎么投,才能源源不断赚钱?
  15. 微信小程序测试注意事项
  16. 如何求字符串的长度c语言,C语言中求字符串长度的函数的几种实现方法
  17. 运行您自己的电子邮件服务器:自定义Roundcube
  18. 人工智能--人类的二次进化
  19. unity获取obs虚拟摄像头
  20. Windows 11 22H2 (2022 年更新) 发布,简体中文版、英文版下载

热门文章

  1. 数据中心UPS维护和使用十大注意事项
  2. android 关于关于子线程更新UI的一些事
  3. 【翻译】针对多种设备定制Ext JS 5应用程序
  4. uva 10985 Rings'n'Ropes
  5. 编写程序,使用一维数组,模拟栈数据结构。 要求: 1、这个栈可以存储java中的任何引用类型的数据。 2、在栈中提供push方法模拟压栈。(栈满了,要有
  6. 信息学奥赛一本通(1216:红与黑)
  7. 最长配对(51Nod-2494)
  8. 求后序遍历(信息学奥赛一本通-T1339)
  9. 31 SD配置-主数据-信用管理-定义自动信贷控制
  10. 45 MM配置-采购-条件-定价过程-定义定价计算方案