Wkwebview Xmlhttprequest With File Url
Solution 1:
This solved my problem:
let config = WKWebViewConfiguration()
config.userContentController = contentController
config.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs")
webView = WKWebView(frame: .zero, configuration: config)
webView.uiDelegate = self
webView.navigationDelegate = self
view = webView
Solution 2:
For those who came though SO to find this topic:
This isn't official to turn off the security in WKWebView, but we could use the private API to allow this just like this guy did for the Cordova project: cordova-plugin-wkwebviewxhrfix
The clue is to create the configuration for the WebView and set the allowFileAccessFromFileURLs property.
WKWebViewConfiguration* configuration = originalImpSend(_self, selector, settings);
// allow access to file api@try {
[configuration.preferences setValue:@TRUE forKey:@"allowFileAccessFromFileURLs"];
}
@catch (NSException*exception) {}
@try {
[configuration setValue:@TRUE forKey:@"allowUniversalAccessFromFileURLs"];
}
@catch (NSException*exception) {}
return configuration;
But as I mentioned this is the private API and it could be a reason to reject your application in Apple's App Review. If you want to publish your app in App Store, please consider to run some lightweight HTTP server instead of violate overall security of the web view. Example: GCDWebServer.
Solution 3:
So the accepted was not working for me when I first tried it (I was doing it wrong at the time) and the bug about (https://bugs.webkit.org/show_bug.cgi?id=154916) it strongly recommends against doing it. My solution was to implement a custom url scheme and use that to load all files. Looks like this.
First creating the WKWebView to which the url scheme is attached (you must create the WKWebView yourself, it can't be created on a storyboard).
overridefuncviewDidLoad() {
let configuration =WKWebViewConfiguration()
configuration.setURLSchemeHandler(PrayerAssetHandler(), forURLScheme: "x-file")
webview =WKWebView(frame: webContentView.bounds, configuration: configuration)
self.webContentView.addSubview(webview!)
webview?.autoresizingMask = webContentView.autoresizingMask
webview!.navigationDelegate =selfsuper.viewDidLoad()
}
Then implement the handler.
import Foundation
import WebKit
import MobileCoreServices
classPrayerAssetHandler: NSObject, WKURLSchemeHandler {
funcwebView(_webView: WKWebView, starturlSchemeTask: WKURLSchemeTask) {
let url = urlSchemeTask.request.url!let pathArr = url.path.components(separatedBy: ".")
let forResource: String= pathArr[0]
let ofType: String? = pathArr.count >1? pathArr[1] : nillet bundlePath =Bundle.main.path(forResource: "data_sub_folder"+ forResource, ofType: ofType)
let fileExtension: CFString= ofType!asCFStringguardlet extUTI =UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,
fileExtension, nil)?.takeUnretainedValue()
else { return }
guardlet mimeUTI: NSString=UTTypeCopyPreferredTagWithClass(extUTI,
kUTTagClassMIMEType)?.takeRetainedValue()
else { return }
let mimeType: String= mimeUTI asStringdo {
let data: Data=tryNSData(contentsOfFile: bundlePath!) asData//Create a NSURLResponse with the correct mimetype.let urlResponse =URLResponse(url: url, mimeType: mimeType,
expectedContentLength: data.count, textEncodingName: "utf8")
urlSchemeTask.didReceive(urlResponse)
urlSchemeTask.didReceive(data)
urlSchemeTask.didFinish()
} catch_asNSError {
return
}
}
funcwebView(_webView: WKWebView, stopurlSchemeTask: WKURLSchemeTask) {
}
}
Solution 4:
Setting value in preferences is not working in Swift 5. Set in 'WKWebViewConfiguration' as shown below.
// Configurationlet webConfiguration =WKWebViewConfiguration()
webConfiguration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs")
webConfiguration.setValue(true, forKey: "allowUniversalAccessFromFileURLs")
// Web Viewlet webView =WKWebView(frame: webviewContainer.frame, configuration: webConfiguration)
Post a Comment for "Wkwebview Xmlhttprequest With File Url"