与UIWebView和以前版本的WKWebView(iOS 10和macOS 10.12)不同,本地文件的默认加载操作已从Bundle.main.path移动到Bundle.main.url.类似地,loadFileURL也成为在WKWebView中加载本地资源的默认函数.

我知道.path.url是完全不同的,在过go 都是有效的——.path在历史上是默认 Select 的方法;然而,最新版本的Swift似乎已经打破了大多数(如果不是全部的话).path个解决方案.这.path个解决方案现在似乎可以改变目录层次 struct ,将所有CSS、JS和任何其他子目录内容放在一个大目录中.这会在WKWebViewtry 加载索引时导致加载错误.例如,html,带有链接的子文件夹样式表(即/css/style.css).

在看到无数问题和无数不确定/不完整的答案后,是否有一个快速、无痛的解决方案来实现一个可以加载本地资源(包括链接的CSS/JS文件)的WKWebView,而无需任何变通方法?

推荐答案

Updated for Swift 4, Xcode 9.3


此方法允许WKWebView正确读取链接CSS、JS和大多数其他文件的目录和子目录层次 struct .您确实需要更改HTML、CSS或JS代码.

Solution (Quick)

  1. Add the web folder to your project (File > Add Files to Project)
    • 如果需要,复制项目
    • 创建文件夹引用*
    • 添加到目标(适用的)
  2. 将以下代码添加到viewDidLoad并根据您的需要进行个性化设置:

    let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "website")!
    webView.loadFileURL(url, allowingReadAccessTo: url)
    let request = URLRequest(url: url)
    webView.load(request)
    

Solution (In-Depth)

第一步

将本地web文件的文件夹导入到项目的任意位置.确保你:

Xcode > File > Add Files to

☑️ 如果需要,复制项目

☑️ Create folder references (not "Create groups")

☑️ 增加目标

第二步

使用WKWebView转到视图控制器,并将以下代码添加到viewDidLoad方法中:

let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "website")!
webView.loadFileURL(url, allowingReadAccessTo: url)
let request = URLRequest(url: url)
webView.load(request)
  • index–要加载的文件名(不带.html扩展名)
  • website–web文件夹的名称(index.html应位于该目录的根目录下)

结论

整个代码应该如下所示:

import UIKit
import WebKit

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {

    @IBOutlet weak var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        webView.uiDelegate = self
        webView.navigationDelegate = self

        let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "Website")!
        webView.loadFileURL(url, allowingReadAccessTo: url)
        let request = URLRequest(url: url)
        webView.load(request)
    }

}

如果你们有任何人对这个方法或代码有进一步的问题,我会尽我所能回答!

Swift相关问答推荐

启用完成并发判断以及如何解决警告(续)

我在SwiftUI中的动画无法正常工作

为什么ClosedRange<;Int&>包含的速度比预期慢340万倍?

如何在SWIFT Memory中处理对VAR数组的更新(对COW感到困惑)

BLE 在 ESP32 和 Iphone 之间发送字符串

为什么 XUIView 中的 Binding 看不到更新后的值?

RealityKit - 从中心zoom 模型

从一个范围减go 多个范围

URL appendPathComponent(_:) 已弃用?

将每个枚举 case 与 Swift 中的一个类型相关联

我如何遵守与演员的协议?

自定义 DispatchQueue 服务质量

如何确定扩展中的具体类型?

Swift中的分段错误

为什么我可以转换为 NSManagedObject 但不能转换为我的实体类型?

无法推断泛型参数的参数

如何在 Swift 中遍历 struct 属性?

Swift:创建 UIImage 数组

swift 3 如何获取明天和昨天的日期(注意特殊情况)新月或新年

Swift - 要求实现协议的类是某个类的子类