¡Finalmente resolvieron el error! Ahora podemos usar -[WKWebView loadFileURL:allowingReadAccessToURL:]
. Aparentemente, la solución valió unos segundos en el video 504 de WWDC 2015 que presenta Safari View Controller
Para iOS8 ~ iOS10 (Swift 3)
Como dice la respuesta de Dan Fabulish, este es un error de WKWebView que aparentemente no se está resolviendo en el corto plazo y, como dijo, hay una solución alternativa :)
Estoy respondiendo solo porque quería mostrar el trabajo aquí. El código IMO que se muestra en https://github.com/shazron/WKWebViewFIleUrlTest está lleno de detalles no relacionados que a la mayoría de las personas probablemente no les interese.
La solución es de 20 líneas de código, manejo de errores y comentarios incluidos, sin necesidad de un servidor :)
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
}
Y se puede usar como:
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)
}
}
}