2019独角兽企业重金招聘Python工程师标准>>>

基本实现思路:

  1. 将一个包含JavaScript的POST请求的HTML代码放到工程目录中
  2. 加载这个包含JavaScript的POST请求的代码到WKWebView
  3. 加载完成之后,用Native调用JavaScript的POST方法并传入参数来完成请求
  4. 创建包含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参数问题相关推荐

  1. Swift和Javascript的神奇魔法

    Swift和Javascript的神奇魔法 记录Swift和Javascript如何进行交互 前言 今天在网上看到了一篇介绍Swift和Javascript交互的文章,感觉作者写的很好,因此把作者文章 ...

  2. Android 解决不同进程发送KeyEvent 的问题

    Android 解决不同进程发送KeyEvent 的问题 参考文章: (1)Android 解决不同进程发送KeyEvent 的问题 (2)https://www.cnblogs.com/TerryB ...

  3. javascript 解决IE8 兼容 placeholder 属性 含password

    javascript 解决IE8 兼容 placeholder 属性 含password function placeholderfun(){if( !('placeholder' in docume ...

  4. php 邮件乱码,解决PHP mail发送UTF-8中文邮件乱码

    在这里,我将解决一个问题,也许很多人遇到过,困惑又不知道如何去做的问题. 如何发送中文邮件时没有乱码? 在这里我将告诉你如何发送UTF-8编码格式的中文电子邮件.本文不涉及GBK编码或者GB2312编 ...

  5. JavaScript 解决计算误差

    JavaScript 解决计算误差 在 JavaScript 中执行计算时,精度误差是一个常见的问题.这是因为 JavaScript 使用二进制表示浮点数,因此不能精确表示所有十进制数.这会导致在 J ...

  6. 惠普打印信息页无法连接到服务器,如何解决hp打印机发送打印任务后不打印

    如何解决hp打印机发送打印任务后不打印 打印机(Printer) 是计算机的输出设备之一,用于将计算机处理结果打印在相关介质上.下面是小编帮大家整理的如何解决hp打印机发送打印任务后不打印,供大家参考 ...

  7. 进来看很有趣,用JavaScript打印乘法口诀表 用JavaScript打印加法口诀表 用JavaScript打印菱形 用JavaScript判断是否为回文 用JavaScript解决百只鸡的问题

    每次浪漫主义 [4K超清]五月天<后来的我们>线上版 Mayday Fly TO 2021 希望大家能好好珍惜你身边的那个她,别等失去了才后悔莫及. JavaScript 用JavaScr ...

  8. JavaScript解决常见浏览器兼容问题

    JavaScript解决常见浏览器兼容问题 我们提倡尽可能使用CSS,而且我们常常能做到这一点.现代浏览器有很好的CSS支持-这无疑足够好让你使用CSS来控制布局和版面设计.但是有时候,某些网页元素在 ...

  9. Ubuntu18.04下安装QQ微信——亲测试有效!【同时解决微信不能发送图片问题】

    一.安装deepin-wine环境 进入https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu页面下载zip包(或用git方式克隆) zhenghan@zh ...

最新文章

  1. Java实现pdf和Excel的生成及数据动态插入、导出
  2. 不焦虑、不内卷能拿图灵奖吗?来自智源研究院的灵魂拷问
  3. 用python画万花筒写轮眼_万花筒写轮眼画法教程
  4. 二叉树的创建和遍历-C语言实现
  5. [导入]判断学号前十位的年龄最大的女学生是否是汉族的
  6. js 验证身份证号码
  7. Windows系统下查看某一进程下所有线程的dos命令
  8. centos7 开机启动文件路径_centos7定时运行python脚本
  9. 【图】max51开发板top页
  10. Linux中的 【 find 】 命令
  11. 【笔试/面试】—— 不使用大于、小于、if 语句,实现 max 宏
  12. html中的rem做响应式,使用rem制作响应式网站
  13. Servlet(10)—请求转发和请求重定向
  14. 【C语言视频教程完整版】从入门到进阶,适合C语言初学者计算机考研党考计算机二级大一大二学生学习观看~~~
  15. mysql主库、从库和备库
  16. 用MATLAB敲qda,LOMO_XQDA
  17. 第1章思维导图图片版
  18. 储备物资管理局计算机,国考报名税务过审居首 储备物资管理局最抢手
  19. Python小记(一):import和from。。。import区别?
  20. 如何精准实现OCR文字识别?

热门文章

  1. Android笔记:防反编译、代码混淆中,解决第三方jar包不被混淆的一些心得,及gson防混淆方法...
  2. JAVA (集合和数据结构)
  3. 【云栖说第三期】发现大家对能模仿马云声音的ET有兴趣,我们找了阿里四位专家来聊聊ET背后的人工智能...
  4. Chapter 1 First Sight——14
  5. 黄聪:主目录安装Wordpress,根目录安装Discus,httpd.ini如何写?
  6. Freetype学习笔记(轉)
  7. 5G NGC — 关键技术 — R16 eSBA
  8. 微服务架构 — 设计原则
  9. 4G LTE/EPC UE 的业务请求流程
  10. Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller