[swift]-使用JavaScript解决WKWebView无法发送POST参数问题
2019独角兽企业重金招聘Python工程师标准>>>
基本实现思路:
- 将一个包含JavaScript的POST请求的HTML代码放到工程目录中
- 加载这个包含JavaScript的POST请求的代码到WKWebView
- 加载完成之后,用Native调用JavaScript的POST方法并传入参数来完成请求
- 创建包含JavaScript的POST请求的HTML代码
相关代码:
<html><head><script>//调用格式: post('URL', {"key": "value"});function post(path, params) {var method = "post";var form = document.createElement("form");form.setAttribute("method", method);form.setAttribute("action", path);for(var key in params) {if(params.hasOwnProperty(key)) {var hiddenField = document.createElement("input");hiddenField.setAttribute("type", "hidden");hiddenField.setAttribute("name", key);hiddenField.setAttribute("value", params[key]);form.appendChild(hiddenField);}}document.body.appendChild(form);form.submit();}</script></head><body></body>
</html>
将这段代码拷贝下来,然后粘贴到文本编辑器中,名字可以随意起,比如保存为:JSPOST.html,然后拷贝到工程目录中,记得选择对应的Target和勾选Copy items if needed(默认应该是勾选的)。这时候,就可以用这段JavaScript代码来发送带参数的POST请求了。
将对应的JavaScript代码通过加载本地网页的形式加载到WKWebView
=======OC代码:=======
// JS发送POST的Flag,为真的时候会调用JS的POST方法(仅当第一次的时候加载本地JS) self.needLoadJSPOST = YES;
// 创建WKWebView
self.webView = [[WKWebView alloc] initWithFrame:[UIScreen mainScreen].bounds];
//设置代理
self.webView.navigationDelegate = self;
// 获取JS所在的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"JSPOST" ofType:@"html"];
// 获得html内容
NSString *html = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// 加载js
[self.webView loadHTMLString:html baseURL:[[NSBundle mainBundle] bundleURL]];
// 将WKWebView添加到当前View
[self.view addSubview:self.webView];
======Swift代码:=======
// JS发送POST的Flag,为真的时候会调用JS的POST方法(仅当第一次的时候加载本地JS)
needLoadJSPOST = true
// 创建WKWebView
webView = WKWebView(frame: UIScreen.mainScreen().bounds)
//设置代理
webView.navigationDelegate = self
// 获取JS路径
let path = NSBundle.mainBundle().pathForResource("JSPOST", ofType: "html")
// 获得html内容
do {let html = try String(contentsOfFile: path!, encoding: NSUTF8StringEncoding)// 加载jswebView.loadHTMLString(html, baseURL: NSBundle.mainBundle().bundleURL)
} catch { }
// 将WKWebView添加到当前View
view.addSubview(webView)
这段代码就相当于把工程中的JavaScript脚本加载到WKWebView中了,后面就是看怎么用了。(请注意换成您的文件名)
Native调用JavaScript脚本并传入参数来完成POST请求
还记得 WKWebView和JavaScript的交互这一节嘛?现在该Native调用JavaScript了,如果忘记了,请往前翻温故一下:- webView:didFinishNavigation:代理表明页面已经加载完成,我们在这里操作,下面上代码:
=======OC代码:=======
// 加载完成的代理方法
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {// 判断是否需要加载(仅在第一次加载)if (self.needLoadJSPOST) {// 调用使用JS发送POST请求的方法[self postRequestWithJS];// 将Flag置为NO(后面就不需要加载了)self.needLoadJSPOST = NO;}
}// 调用JS发送POST请求
- (void)postRequestWithJS {// 发送POST的参数NSString *postData = @"\"username\":\"aaa\",\"password\":\"123\"";// 请求的页面地址NSString *urlStr = @"http://www.postexample.com";// 拼装成调用JavaScript的字符串NSString *jscript = [NSString stringWithFormat:@"post('%@', {%@});", urlStr, postData];// NSLog(@"Javascript: %@", jscript);// 调用JS代码[self.webView evaluateJavaScript:jscript completionHandler:^(id object, NSError * _Nullable error) {}];
}
=======Swift代码:=======
// 加载完成的代理方法
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {// 判断是否需要加载(仅在第一次加载)if needLoadJSPOST {// 调用使用JS发送POST请求的方法postRequestWithJS()// 将Flag置为NO(后面就不需要加载了)needLoadJSPOST = false}
}
// 调用JS发送POST请求
func postRequestWithJS() {// 发送POST的参数let postData = "\"username\":\"aaa\",\"password\":\"123\""// 请求的页面地址let urlStr = "http://www.postexample.com"// 拼装成调用JavaScript的字符串let jscript = "post('\(urlStr)', {\(postData)});"// 调用JS代码webView.evaluateJavaScript(jscript) { (object, error) in}
}
结束.
转载于:https://my.oschina.net/xiaoLoo/blog/1843791
[swift]-使用JavaScript解决WKWebView无法发送POST参数问题相关推荐
- Swift和Javascript的神奇魔法
Swift和Javascript的神奇魔法 记录Swift和Javascript如何进行交互 前言 今天在网上看到了一篇介绍Swift和Javascript交互的文章,感觉作者写的很好,因此把作者文章 ...
- Android 解决不同进程发送KeyEvent 的问题
Android 解决不同进程发送KeyEvent 的问题 参考文章: (1)Android 解决不同进程发送KeyEvent 的问题 (2)https://www.cnblogs.com/TerryB ...
- javascript 解决IE8 兼容 placeholder 属性 含password
javascript 解决IE8 兼容 placeholder 属性 含password function placeholderfun(){if( !('placeholder' in docume ...
- php 邮件乱码,解决PHP mail发送UTF-8中文邮件乱码
在这里,我将解决一个问题,也许很多人遇到过,困惑又不知道如何去做的问题. 如何发送中文邮件时没有乱码? 在这里我将告诉你如何发送UTF-8编码格式的中文电子邮件.本文不涉及GBK编码或者GB2312编 ...
- JavaScript 解决计算误差
JavaScript 解决计算误差 在 JavaScript 中执行计算时,精度误差是一个常见的问题.这是因为 JavaScript 使用二进制表示浮点数,因此不能精确表示所有十进制数.这会导致在 J ...
- 惠普打印信息页无法连接到服务器,如何解决hp打印机发送打印任务后不打印
如何解决hp打印机发送打印任务后不打印 打印机(Printer) 是计算机的输出设备之一,用于将计算机处理结果打印在相关介质上.下面是小编帮大家整理的如何解决hp打印机发送打印任务后不打印,供大家参考 ...
- 进来看很有趣,用JavaScript打印乘法口诀表 用JavaScript打印加法口诀表 用JavaScript打印菱形 用JavaScript判断是否为回文 用JavaScript解决百只鸡的问题
每次浪漫主义 [4K超清]五月天<后来的我们>线上版 Mayday Fly TO 2021 希望大家能好好珍惜你身边的那个她,别等失去了才后悔莫及. JavaScript 用JavaScr ...
- JavaScript解决常见浏览器兼容问题
JavaScript解决常见浏览器兼容问题 我们提倡尽可能使用CSS,而且我们常常能做到这一点.现代浏览器有很好的CSS支持-这无疑足够好让你使用CSS来控制布局和版面设计.但是有时候,某些网页元素在 ...
- Ubuntu18.04下安装QQ微信——亲测试有效!【同时解决微信不能发送图片问题】
一.安装deepin-wine环境 进入https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu页面下载zip包(或用git方式克隆) zhenghan@zh ...
最新文章
- Java实现pdf和Excel的生成及数据动态插入、导出
- 不焦虑、不内卷能拿图灵奖吗?来自智源研究院的灵魂拷问
- 用python画万花筒写轮眼_万花筒写轮眼画法教程
- 二叉树的创建和遍历-C语言实现
- [导入]判断学号前十位的年龄最大的女学生是否是汉族的
- js 验证身份证号码
- Windows系统下查看某一进程下所有线程的dos命令
- centos7 开机启动文件路径_centos7定时运行python脚本
- 【图】max51开发板top页
- Linux中的 【 find 】 命令
- 【笔试/面试】—— 不使用大于、小于、if 语句,实现 max 宏
- html中的rem做响应式,使用rem制作响应式网站
- Servlet(10)—请求转发和请求重定向
- 【C语言视频教程完整版】从入门到进阶,适合C语言初学者计算机考研党考计算机二级大一大二学生学习观看~~~
- mysql主库、从库和备库
- 用MATLAB敲qda,LOMO_XQDA
- 第1章思维导图图片版
- 储备物资管理局计算机,国考报名税务过审居首 储备物资管理局最抢手
- Python小记(一):import和from。。。import区别?
- 如何精准实现OCR文字识别?
热门文章
- Android笔记:防反编译、代码混淆中,解决第三方jar包不被混淆的一些心得,及gson防混淆方法...
- JAVA (集合和数据结构)
- 【云栖说第三期】发现大家对能模仿马云声音的ET有兴趣,我们找了阿里四位专家来聊聊ET背后的人工智能...
- Chapter 1 First Sight——14
- 黄聪:主目录安装Wordpress,根目录安装Discus,httpd.ini如何写?
- Freetype学习笔记(轉)
- 5G NGC — 关键技术 — R16 eSBA
- 微服务架构 — 设计原则
- 4G LTE/EPC UE 的业务请求流程
- Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller