swift 加载 本地html 和 网络路径

先上代码: xcode 9.4

import UIKit
import WebKit

class RootViewController: UIViewController,WKNavigationDelegate {
    var webView: WKWebView!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 创建视图
        let screen = UIScreen.main.bounds
        // 按钮栏
        let buttonbarWidth:CGFloat = 316
        let buttonbar = UIView(frame: CGRect(x: (screen.size.width - buttonbarWidth)/2,y: 20,width:buttonbarWidth,height: 70))
        self.view.addSubview(buttonbar)
        
        let width = buttonbar.frame.size.width / 2 - 10
    //添加按钮
        let buttonHTML = UIButton(type: UIButtonType.system)
        buttonHTML.setTitle("通过路径加载",for: UIControlState())
        buttonHTML.frame = CGRect(x:0,y:0,width: width,height: 30)
        //添加事件
        buttonHTML.addTarget(self,action: #selector(buttonHTML(_:)),for: .touchUpInside)
        buttonbar.addSubview(buttonHTML)
    
    //添加 loadHTMLString 按钮
        let loadHTMLString = UIButton(type: UIButtonType.system)
        loadHTMLString.setTitle("loadHTMLString",for: UIControlState())
        loadHTMLString.frame = CGRect(x: width + 10,height: 30)
        //添加事件
        loadHTMLString.addTarget(self,action: #selector(loadHTMLString(_:)),for: .touchUpInside)
        buttonbar.addSubview(loadHTMLString)
        
    //添加loadData按钮
        let loadData = UIButton(type: UIButtonType.system)
        loadData.setTitle("loadData",for: UIControlState())
        loadData.frame = CGRect(x:0,y: 40,height: 30)
        //添加事件
        loadData.addTarget(self,action: #selector(loadData(_:)),for: .touchUpInside)
        buttonbar.addSubview(loadData)
        
    //添加loadRequest按钮--- 加载网络地址
        let loadRequest = UIButton(type: UIButtonType.system)
        loadRequest.setTitle("loadRequest",for: UIControlState())
        loadRequest.frame = CGRect(x: width + 10,height: 30)
        //添加事件
        loadRequest.addTarget(self,action: #selector(loadRequest(_:)),for: .touchUpInside)
        buttonbar.addSubview(loadRequest)
        
    //添加WKWebView
        self.webView = WKWebView(frame: CGRect(x:0,y: 100,width: screen.size.width,height: screen.size.height - 100 ))
        self.view.addSubview(webView)
    }
    // 加载本地html 点击事件
    @objc func buttonHTML(_ sender: AnyObject){
        // 方法一 加载路径
        let htmlPath = Bundle.main.path(forResource: "index",ofType: "html")
        if let htmlPath =  htmlPath {
            let url = URL.init(fileURLWithPath: htmlPath) // 把字符串 转成 URL 类型
            let request = URLRequest(url: url)
            self.webView.load(request)
            self.webView.navigationDelegate = self
        }
        // 方法二 加载路径
        //        let htmlPath = Bundle.main.url(forResource: "index",withExtension: "html")
        //        if let htmlPath = htmlPath{
        //            let request = URLRequest(url: htmlPath)
        //            self.webView.load(request)
        //            self.webView.navigationDelegate = self
        //        }
    }
    // loadHTMLString
    @objc func loadHTMLString(_ sender: AnyObject){
        // 方法一 直接加载 html 字符串
        //        let bundleUrl = NSURL.fileURL(withPath: Bundle.main.bundlePath)
        //        self.webView.loadHTMLString("<html><head><Meta charset=‘utf-8‘/><title>测试</title></head><body><h1>测试标题</h1></body></html>",baseURL: bundleUrl)
        
        // 方法二 把本地文件转成字符串,进行加载
        let htmlPath = Bundle.main.path(forResource: "index2",ofType: "html")
        let bundleUrl = NSURL.fileURL(withPath: Bundle.main.bundlePath)
        do{
            let html = try Nsstring(contentsOfFile: htmlPath!,encoding: String.Encoding.utf8.rawValue)
            self.webView.loadHTMLString(html as String,baseURL: bundleUrl)
        }catch let err as NSError{
            err.description
        }
    }
    // loadData 方式加载 -- > loadData 已经转换成--> load
    @objc func loadData(_ sender: AnyObject){
        let htmlPath = Bundle.main.path(forResource: "index3",ofType: "html")
        let bundleUrl = NSURL.fileURL(withPath: Bundle.main.bundlePath)
        
        let htmlData = NSData(contentsOfFile: htmlPath!)
        // NSData 要先转换成 Data 类型
        self.webView.load(htmlData! as Data,mimeType: "text/html",characterEncodingName: "utf-8",baseURL: bundleUrl)
        
    }
    // loadRequest 加载网络路径 ---> loadRequest 已经改为 load,NSURL --> URL,NSURLRequest -->  URLRequest
    @objc func loadRequest(_ sender: AnyObject){
        let url = URL(string: "https://baidu.com")
        let request = URLRequest(url: url!)
        self.webView.load(request)
        self.webView.navigationDelegate = self
    }
    // 委托协议的监听方法
    func webView(_ webView: WKWebView,didStartProvisionalNavigation navigation: WKNavigation!) {
        print("开始加载")
    }
    func webView(_ webView: WKWebView,didCommit navigation: WKNavigation!) {
        print("内容开始返回")
    }
    func webView(_ webView: WKWebView,didFinish navigation: WKNavigation!) {
        print("加载完成")
    }
    func webView(_ webView: WKWebView,didFailProvisionalNavigation navigation: WKNavigation!,withError error: Error) {
        print("加载失败 error:" + error.localizedDescription)
    }
}

上面 有四种方式 加载html 网页,

加载本地 html 的方法 有:

  1. buttonHTML
  2. loadHTMLString
  3. loadData
加载网络路径
  loadRequest

案例中每一种方法都可以加载成功,加载方式大同小异

分享图片



加载本地文件,会自动去找到文件,如上图 2 个静态文件夹,里面没找到就会寻找外面的静态文件夹。

加载网络资源会报错处理一下就好:https://www.cnblogs.com/bruce-gou/p/10517044.html

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...