文档章节

iOS WKWebView 加载本地html文件(swift)

dubox
 dubox
发布于 01/21 17:41
字数 578
阅读 792
收藏 1

 

最近一个项目需要用 iOS 加载网页,下面简单记录一下WKWebView加载本地html 文件;

 

ViewController.swift

//
//  ViewController.swift
//  jmj_storeshow
//
//  Created by dubox on 2018/1/16.
//  Copyright © 2018年 dubox. All rights reserved.
//

import UIKit
import WebKit

class ViewController: UIViewController , WKUIDelegate{

    var webView: WKWebView!
   
    
    override func loadView() {
        
        let conf = WKWebViewConfiguration()
        conf.userContentController = WKUserContentController()
        conf.preferences.javaScriptEnabled = true
        conf.selectionGranularity = WKSelectionGranularity.character
        conf.allowsInlineMediaPlayback = true
        //注册 js 消息通道
        conf.userContentController.add(self , name: "msgBridge")
        
        webView = WKWebView(frame: .zero, configuration: conf)  //.zero
        webView.uiDelegate = self
        //禁止顶部下拉 和 底部上拉效果
        webView.scrollView.bounces = false
        //解决全屏播放视频 状态栏闪现导致的底部白条  never:表示不计算内边距
        webView.scrollView.contentInsetAdjustmentBehavior = .never
        
        view = webView
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        
        /**加载 https 链接  **/
        //let myURL = URL(string: "http://192.168.2.186:8080")
        //let myRequest = URLRequest(url: myURL!)
        //webView.load(myRequest)
        
        /**加载本地 HTML文件**/
            //从主Bundle获取 HTML 文件的 url
        let fileURL =  Bundle.main.url(forResource: "dist/index", withExtension: "html" )
        webView.loadFileURL(fileURL!,allowingReadAccessTo:Bundle.main.bundleURL);
        
        /**加载 html 内容**/
        //webView.loadHTMLString("<h1>h1</h1><img src='.html/images/h.png'>", baseURL: Bundle.main.bundleURL);
    }
    
   

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    


}

extension ViewController: WKNavigationDelegate {
    
}

//js 和 swift 的交互
extension ViewController: WKScriptMessageHandler {
    
    //接收 js 发来的消息
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        
        //判断消息通道
        if(message.name == "msgBridge"){
            //TODO ...
            //message.body(any 类型) 即前端 js 传来的数据,如果传字符串这里接收的就是字符串,如果传 json 对象或 js 对象 则这里是 NSDictionary
            print(message.body)
            let msg = message.body as! NSDictionary;
            
            //swift 调 js函数
            webView.evaluateJavaScript("funcforswift('\( msg["msg"]  as! String)')", completionHandler: {
                (any, error) in
                if (error != nil) {
                    print(error ?? "err")
                }
            })
        }
        
    }
}

index.html

<!--引入外部 css-->
<link  rel="stylesheet" type="text/css" href="css/test.css"/>
<script>
    //测试内嵌 js
    document.write('kkk');
    document.getElementById('h').style="color:red;";
    
    alert('aa');  //alert在 WKWebView 中没效果
</script>
<h1 id="h">
    hello word
    </h1>

<img src="images/h.png">
    
    <!--引入外部 js-->
<script src="js/test.js"></script>


<!--
 
 这里所有引入的文件 css、js、img  都需要相对路径,
 包括 css 文件中引入的图片、字体等
 -->

 

 

test.js


document.getElementById('h').onclick = function(){
    //向 swift 发送数据,这里的‘msgBridge’就是 swift 中添加的消息通道的 name
    window.webkit.messageHandlers.msgBridge.postMessage({"msg":"#test msg"});
}


//这是一个普通的 js 函数,将在 swift 中调用该函数
function funcforswift(msg){
    
    document.getElementById('h').innerText+=msg;
    
}

效果展示:

点击前:

点击后:

xcode 打印:

 

 

 

这里面要注意的是 html 路径,我在这儿坑了好久。。。~~!

主要是 bundle resources ,如果在 Xcode 中右键添加文件 这里会自动加上

这里的bundle 是 main bundle,网上说使用自定义bundle会更好,后面有时间了在研究吧,

感觉 swift 比 OC 还。。。

© 著作权归作者所有

共有 人打赏支持
dubox
粉丝 3
博文 96
码字总数 27792
作品 0
西安
程序员
私信 提问
iOS涂色涂鸦效果、Swift仿喜马拉雅FM、抽屉转场动画、拖拽头像、标签选择器等源码

iOS精选源码 LeeTagView 标签选择控件(http://www.code4app.com/thread-31033-1-1.html) 为您的用户显示界面添加美观的加载视图(http://www.code4app.com/thread-31038-1-1.html) Swift4: 可......

sunnyaigd
09/19
0
0
iOS WKWebView UI增强(上拉刷新,JS交互,加载进度条)

iOS WKWebView UI增强(上拉刷新,JS交互,加载进度条) 需求:WKWebView的一些增加模块,例如上拉刷新,JS交互,加载进度条等等持续更新 阅读前提: } catch(error) { } } (void)headerRefres...

__小___东邪___
11/06
0
0
iOS与JS交互之WKWebView-协议拦截

级别:★★☆☆☆ 标签:「iOS与JS交互」「WKWebView与JS交互」「WKWebView拦截协议」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),J...

QiShare
09/01
0
0
浅谈WKWebView使用、JS的交互

前言 WKWebView是iOS8 出来的浏览器控件,用来取代UIWebView.对于WKWebView与UIWebView的对比特点,这里就不过多的叙述,都算是老生常谈的问题了,网上的说明也很多.近来在做Web端,需要植入移动端...

神经骚栋
07/03
0
0
iOS与JS交互之UIWebView-协议拦截

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「UIWebView拦截协议」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),J...

QiShare
08/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Yearning基于Inception的开源SQL审核平台

基础环境: python3 nodejs vuejs mysql python-ldap pymysql mysql 新建数据库 create database Yearning DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; Navicat导入初始化数据 : ......

以谁为师
13分钟前
0
0
flutter Expanded用法

使用的地方:一个分类,类似京东的,左右两边都可以滑动 Widget build(BuildContext context) { return Row(children: [ Column( children: <Widget>[ Ex......

大灰狼wow
18分钟前
2
0
Java8 Map中新增的方法使用总结

前言 得益于 Java 8 的 default 方法特性,Java 8 对 Map 增加了不少实用的默认方法,像 getOrDefault, forEach, replace, replaceAll, putIfAbsent, remove(key, value), computeIfPresent,......

kaixin_code
28分钟前
1
0
@TransactionConfiguration

@TransactionConfiguration过时与替代写法 @TransactionConfiguration 替代写法

miaojiangmin
30分钟前
0
0
浅谈Vue响应式(数组变异方法)

很多初使用Vue的同学会发现,在改变数组的值的时候,值确实是改变了,但是视图却无动于衷,果然是因为数组太高冷了吗? 查看官方文档才发现,不是女神太高冷,而是你没用对方法。 看来想让女...

开元中国2015
31分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部