Open afioletov opened 3 years ago
I created simple swift application that does the same: load file from bundle and tries to change location to data folder (cache). It fails the same way.
Actually WebKit can load files from data container as well. I changed loadRequest method and load file from cache if it exists.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cacheDirectory = [paths objectAtIndex:0];
NSURL *nsurl = [NSURL fileURLWithPath:[[[cacheDirectory stringByAppendingPathComponent:@"1.11.00000.0000"] stringByAppendingPathComponent:@"www"] stringByAppendingPathComponent:@"Bootloader.html"]]; //locally
NSURL *readAccessToURL1 = [NSURL fileURLWithPath:@"/"];
if(nsurl)
return [(WKWebView*)_engineWebView loadFileURL:nsurl allowingReadAccessToURL:readAccessToURL1];
It works fine, but it cannot load scripts from bundle. Looks like WebKit fails to crossing borders between containers within sandbox. Is there any configuration settings to allow it?
I created a bug in webkit's bugzilla.
In our case https://github.com/apache/cordova-ios/issues/1281 changing the page via window.location.href = "file:///..."
simply does not work anymore.
...
localFile = window.WKWebView.convertFilePath(localFile)
window.open(localFile)
works for me, Cordova iOS 6.2.0
Bug Report
Problem
WkWebView cannot open any pages from data container. There are no issues with pages in bundle. Application can download and save new pages/resources into cache folder (cordova.file.cacheDirectory), but attempts to set windows.location to some page in cache folder fail.
What is expected to happen?
It worked fine with UIWebView, and it would be great to have the same possibility with WkWebView
What does actually happen?
If we load file directly:
<content src="Bootloader.html" />
then document location is set to:'file:///private/var/containers/Bundle/Application/GUID/InMotionTestApp.app/www/Bootloader.html'
.We check if cached version exists and try to set location:
window.location='file:///var/mobile/Containers/Data/Application/GUID/Library/Caches/1.11.00000.0000/www/Default.html'
Such attempts fail with 'outside sandbox' error, while we try to open files from sandbox:
If we add schema and hostname to config.xml like it's recommended in blog:
We do not get error in Xcode, but get error in web inspector:
Not allowed to load local resource: file:///var/mobile/Containers/Data/Application/A3E5D945-5503-4D23-A54F-C1135CE08CD8/Library/Caches/1.11.00000.0000/www/Default.html
Replacing 'file://' with 'app://localhost' does not help, it just generates 404 error.
Version information
Cordova CLI 10.0.0 "cordova-ios": "^6.2.0", "cordova-custom-config": "^5.1.0", "cordova-plugin-auth-dialog": "^0.1.6", "cordova-plugin-camera": "^4.1.0", "cordova-plugin-compat": "^1.2.0", "cordova-plugin-device": "^2.0.3", "cordova-plugin-emm-app-config": "^1.0.2", "cordova-plugin-file": "^6.0.2", "cordova-plugin-inappbrowser": "^5.0.0", "cordova-plugin-network-information": "^2.0.2", "cordova-plugin-statusbar": "^2.4.3", "cordova-plugin-whitelist": "^1.3.4", "cordova-plugin-zeep": "0.0.4"
I debug it on iOS 14.6 from Xcode 12.5.1 on macOS Big Sur 11.5
Checklist