Ils ont finalement résolu le bug! Maintenant, nous pouvons utiliser -[WKWebView loadFileURL:allowingReadAccessToURL:]
. Apparemment, le correctif valait quelques secondes dans la vidéo de la WWDC 2015 504 Présentation de Safari View Controller
Pour iOS8 ~ iOS10 (Swift 3)
Comme l' indique la réponse de Dan Fabulish, il s'agit d'un bogue de WKWebView qui n'est apparemment pas résolu de sitôt et comme il l'a dit, il y a une solution :)
Je réponds simplement parce que je voulais montrer le contournement ici. Le code IMO affiché sur https://github.com/shazron/WKWebViewFIleUrlTest regorge de détails sans rapport avec la plupart des gens ne sont probablement pas intéressés.
Le contournement est de 20 lignes de code, gestion des erreurs et commentaires inclus, pas besoin d'un serveur :)
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
}
Et peut être utilisé comme:
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)
}
}
}