首页 > 其他分享 >IOS Swift WKWebView使用以及与JS交互

IOS Swift WKWebView使用以及与JS交互

时间:2023-04-17 16:34:37浏览次数:37  
标签:IOS JS html let func myURL webView Swift WKWebView


一、Swift WKWebView使用

1、加载百度网站

打开xcode,在最上方工具栏新建project

IOS Swift WKWebView使用以及与JS交互_IOS Swift

IOS Swift WKWebView使用以及与JS交互_WKWebView与JS交互_02

注意要选Storyboard

IOS Swift WKWebView使用以及与JS交互_WKWebView_03

工程建好后 ViewController.swift 这个文件是编写主视图文件,改成下面

import UIKit
import WebKit

class ViewController: UIViewController, WKUIDelegate {

    var webView:WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration();
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self;
        view = webView;
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let myURL = URL(string:"https://www.baidu.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }

}

点击运行模拟器

IOS Swift WKWebView使用以及与JS交互_IOS Swift_04

网站加载成功 

IOS Swift WKWebView使用以及与JS交互_WKWebView_05

2、直接加载html内容

override func viewDidLoad() {
   super.viewDidLoad()
   let content = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"/></head><body><h1>IOS WKWebview</h1></body></html>"
   webView.loadHTMLString(content, baseURL: nil)
}

注意:如果html里要加载css,那么只有baseURL不是nil才会生效

3、加载本地HTML文件

新建web文件夹和html文件

IOS Swift WKWebView使用以及与JS交互_html_06

index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <link rel="stylesheet" href="index.css" />
    <script type="text/javascript" src="index.js"></script>
    <title>wkwebview</title>
</head>
<body>
    <h1>WKWebview</h1>
    <p id="demo">这是一个段落</p>
    <button type="button" onclick="displayDate()">显示日期</button>
</body>
</html>

index.css

h1 {
    color: red;
}
body {
    font-size: 4em;
}
button {
    font-size: 1em;
}

index.js

function displayDate(){
    document.getElementById("demo").innerHTML=Date();
}

同时Copy Bundle Resources里要追加三个文件

IOS Swift WKWebView使用以及与JS交互_IOS Swift_07

加载html文件有两种写法:

法一:

let myURL = Bundle.main.url(forResource: "index", withExtension: "html")
webView.load(URLRequest(url: myURL!))

法二:

let myPath = Bundle.main.path(forResource: "index", ofType: "html")
let myURL = URL(fileURLWithPath: myPath!)
webView.loadFileURL(myURL, allowingReadAccessTo: Bundle.main.bundleURL)

IOS Swift WKWebView使用以及与JS交互_WKWebView_08

二、WKWebView调用JS

这里需要使用 webview 的 WKNavigationDelegate 代理在 webview 加载完成后调用 js 方法

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {

    var webView:WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration();
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.navigationDelegate = self;
        view = webView;
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let myURL = Bundle.main.url(forResource: "index", withExtension: "html")
        webView.load(URLRequest(url: myURL!))
    }
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        webView.evaluateJavaScript("displayDate()") { (any, error) in
            if (error != nil) {
                print(error ?? "err")
            }
        }
    }

}

IOS Swift WKWebView使用以及与JS交互_ide_09

三、JS调用Swift

ViewController.swift

import UIKit
import WebKit

// 注意:要引用 WKScriptMessageHandler 
class ViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler {

    var webView:WKWebView!
    
    override func loadView() {
        let conf = WKWebViewConfiguration();
        conf.userContentController.add(self, name: "yunan")
        webView = WKWebView(frame: .zero, configuration: conf)
        webView.navigationDelegate = self;
        view = webView;
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let myURL = Bundle.main.url(forResource: "index", withExtension: "html")
        webView.load(URLRequest(url: myURL!))
    }
    
    func userContentController(_ userContentController: WKUserContentController,
                               didReceive message: WKScriptMessage) {
        //判断消息通道
        if(message.name == "yunan"){
            print(message.body)
        }
    }
}

index.js

function displayDate(){
    // 向 swift 发送数据,这里的 yunan 就是 swift 中添加的消息通道的 name
    window.webkit.messageHandlers.yunan.postMessage({"msg":"hello world"});
}

点击按钮可以看到xcode打印log

IOS Swift WKWebView使用以及与JS交互_ide_10

标签:IOS,JS,html,let,func,myURL,webView,Swift,WKWebView
From: https://blog.51cto.com/u_12374018/6195455

相关文章

  • js深度拷贝
    法一:有局限性//通过js的内置对象JSON来进行数组对象的深拷贝functiondeepClone(obj:any):any{const_obj=JSON.stringify(obj),constobjClone=JSON.parse(_obj);returnobjClone;}这种简单粗暴的方法有其局限性,当值为undefined、function、symbol会在转换过程......
  • npm自定义模块及发布模块NodeJS
    在模块目录下执行:npminit(可以加--yes一键生成)新建文件index.jsvaryunan='helloyunan';module.exports=yunan;然后将文件夹放到node_modules可以用下面方法使用试试constyunan=require('huyunan');console.log('yunan',yunan);//yunanhelloyunan发布之前......
  • axios
    axios使用参考:http://www.axios-js.com/zh-cn/docs/index.html#axios-API定时:https://blog.csdn.net/weixin_43574035/article/details/126233221......
  • win7换xp系统bios怎么设置
    我们在使用win7操作系统的时候,有的小伙伴们因为一些需要想要把自己的系统换成xp操作系统。那么在这个过程中一些小伙伴们可能就遇到了一些问题。对于win7换xp系统bios怎么设置,小编觉得首先通快捷键进入我们电脑的bios,然后找到相关选项跟着小编进行设置即可。具体操作步骤一起来看......
  • 使用js对tensorspace/three.js/webgl进行截图
    使用js对tensorspace/three.js/webgl进行截图问题分析场景:在右侧,是tensorspace库使用three.js调用webgl对模型进行渲染的画面。我需要使用js对右侧画面进行截图,并保存至本地用于分析。问题:对webgl进行截图需要进行一些特别的操作,使用html2canvas行不通。同时,针对tensorspa......
  • ASEMI代理ADAU1701JSTZ-RL原装ADI车规级ADAU1701JSTZ-RL
    编辑:llASEMI代理ADAU1701JSTZ-RL原装ADI车规级ADAU1701JSTZ-RL型号:ADAU1701JSTZ-RL品牌:ADI/亚德诺封装:LQFP-48批号:2023+安装类型:表面贴装型引脚数量:48类型:车规级芯片工作温度:−0°C~70°CADAU1701JSTZ-RL特征28-/56位,50MIPS数字音频处理器从串行EEPROM自启动用于模拟控制的带4输......
  • js开发规范
    ####################### 1.缩进[强制] 使用4个空格做为一个缩进层级,不允许使用2个空格或tab字符。[强制] switch中缩进2个空格[强制] 要求分号前面不可以有空格,后面可以有空格[强制] 要求语句块之前保留一个空格[强制] 关键字和类似关键字前后保留一个空格[强制] 要......
  • 【js】时间戳转时间 1680338700 =》2023-04-01 16:45:00
    1transformTimestamp(timestamp){2letdate=newDate(parseInt(timestamp)*1000)3letYear=date.getFullYear()4letMoth=(date.getMonth()+1<10?'0'+(date.getMonth()+1):date.getMonth()+1)5letDay=(date.getDat......
  • 盘点国内前端npm CDN替代方案,基本上可以替代unpkg、jsdelivr
    收集一波常见的加速NPM包的CDN,发现有些还是挺好用的,用来做博客或者网站加载NPM使用还是可以的。经典老牌的CDN加速unpkg.comcdn.jsdelivr.netfastly.jsdelivr.net使用方法:直接进官网,搜NPM包名使用。缺点:有时候不是很稳定,而且国内有些地方没法访问,jsdelivr曾经被用来结合......
  • python+playwright 学习-52 iframe 定位与操作元素,监听事件,执行JS脚本总结
    前言本篇全面总结关于iframe的定位,iframe上元素的操作(输入框,点击等),iframe上的事件监听与iframe上执行JS脚本的总结。iframe对象的定位定位iframe对象,总的来说有四种方法page.frame_locator(selector)通过page对象直接定位iframe对象,传selector选择器参数page.loca......