ในที่สุดพวกเขาก็แก้ไขข้อบกพร่อง! ตอนนี้เราสามารถใช้-[WKWebView loadFileURL:allowingReadAccessToURL:]
. เห็นได้ชัดว่าการแก้ไขนั้นคุ้มค่ากับบางวินาทีในวิดีโอ WWDC 2015 504 แนะนำ Safari View Controller
สำหรับ iOS8 ~ iOS10 (Swift 3)
ในฐานะที่เป็นคำตอบของแดน Fabulish ของรัฐนี้เป็นปัญหาของ WKWebView ซึ่งเห็นได้ชัดไม่ได้ถูกแก้ไขได้ในเร็ว ๆ นี้และในขณะที่เขากล่าวว่ามีการทำงานรอบ :)
ฉันตอบเพียงเพราะต้องการแสดงวิธีแก้ปัญหาที่นี่ รหัส IMO ที่แสดงในhttps://github.com/shazron/WKWebViewFIleUrlTestเต็มไปด้วยรายละเอียดที่ไม่เกี่ยวข้องซึ่งคนส่วนใหญ่อาจไม่สนใจ
วิธีแก้ปัญหาคือโค้ด 20 บรรทัดการจัดการข้อผิดพลาดและความคิดเห็นรวมอยู่ด้วยไม่จำเป็นต้องใช้เซิร์ฟเวอร์ :)
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
}
และสามารถใช้เป็น:
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)
}
}
}