swift 加載 本地html 和 網絡路徑


先上代碼: xcode 9.4  ios 11.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, y:0, width: width, 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, width: width, 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, y: 40, width: width, 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
以上的方式 文件夾是通過 NEW Group 的方式創建的。
如果是 通過菜單 Add Files to 這種方式創建的 則不可以。這種方式創建的文件夾是藍色的如圖

 
        


通過以上方式創建的文件,通過 Bundle.main.path(forResource: "index", ofType: "html") 取不到路徑
    @objc func test(_ sender: AnyObject){
        let bundlePath = Bundle.main.bundlePath
        let path = "file://\(bundlePath)/assets/index.html"
        let url = URL(string: path);
        let request = URLRequest(url: url!)
        self.webView.load(request)
    }

這樣就可以取到路徑值,就可以正常加載






 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM