Cuối cùng họ đã giải quyết được lỗi! Bây giờ chúng ta có thể sử dụng -[WKWebView loadFileURL:allowingReadAccessToURL:]
. Rõ ràng bản sửa lỗi đáng giá vài giây trong WWDC 2015 video 504 Giới thiệu Safari View Controller
Đối với iOS8 ~ iOS10 (Swift 3)
Như câu trả lời của Dan Fabulish nói rằng đây là một lỗi của WKWebView mà dường như sẽ không được giải quyết sớm và như anh ấy đã nói rằng có một công việc xung quanh :)
Tôi trả lời chỉ vì tôi muốn giới thiệu công việc ở đây. Mã IMO được hiển thị trong https://github.com/shazron/WKWebViewFIleUrlTest chứa đầy những chi tiết không liên quan mà hầu hết mọi người có lẽ không quan tâm đến.
Công việc xung quanh là 20 dòng mã, xử lý lỗi và nhận xét bao gồm, không cần máy chủ :)
func fileURLForBuggyWKWebView8(fileURL: URL) throws -> URL {
// Some safety checks
if !fileURL.isFileURL {
throw NSError(
domain: "BuggyWKWebViewDomain",
code: 1001,
userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("URL must be a file URL.", comment:"")])
}
try! fileURL.checkResourceIsReachable()
// Create "/temp/www" directory
let fm = FileManager.default
let tmpDirURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("www")
try! fm.createDirectory(at: tmpDirURL, withIntermediateDirectories: true, attributes: nil)
// Now copy given file to the temp directory
let dstURL = tmpDirURL.appendingPathComponent(fileURL.lastPathComponent)
let _ = try? fm.removeItem(at: dstURL)
try! fm.copyItem(at: fileURL, to: dstURL)
// Files in "/temp/www" load flawlesly :)
return dstURL
}
Và có thể được sử dụng như:
override func viewDidLoad() {
super.viewDidLoad()
var fileURL = URL(fileURLWithPath: Bundle.main.path(forResource:"file", ofType: "pdf")!)
if #available(iOS 9.0, *) {
// iOS9 and above. One year later things are OK.
webView.loadFileURL(fileURL, allowingReadAccessTo: fileURL)
} else {
// iOS8. Things can (sometimes) be workaround-ed
// Brave people can do just this
// fileURL = try! pathForBuggyWKWebView8(fileURL: fileURL)
// webView.load(URLRequest(url: fileURL))
do {
fileURL = try fileURLForBuggyWKWebView8(fileURL: fileURL)
webView.load(URLRequest(url: fileURL))
} catch let error as NSError {
print("Error: " + error.debugDescription)
}
}
}