-
Notifications
You must be signed in to change notification settings - Fork 760
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
File Download and Access Issues on iOS 17.5.1 with Cordova #628
Comments
Same here! Working when reading and writing using the FileSystem-API but not when passing the file-url to for example a HTML-ImageTag. Furthermore my attempt was to convert it using the |
The following scenarios were tested, but the issue persisted:
Workaround (not recommended though):
Weird thing is, that when downloaded the already released version of the same app (release was about half a year ago), the issue is gone It almost seems like it has to do with X-Code. Unfortunately it was not possible for me to check that. |
If you're app is configured to use schemes (e.g. your html page is loaded over v7 (if I recall correctly) of the file plugin introduce changes to produce a DOM-usable url when using the The pasted code is not well formatted and is hard to read but here are some things to check:
If it still doesn't work, please let us know what version of |
Hi, we are using Furthermore, as mentioned above, we faced the same error when re-deploying old apps (that previously had no such issues) that use way older versions of cordova-ios onto iPhones running a pretty modern iOS-Version. |
I also have the problem which @phynae mentioned above. I am operating on |
I was able to take a deeper look this morning and It's missing an implementation override the scheme task and to map a scheme URL to the file on disk to return an asset over the scheme. Workarounds could include reading the asset as a blob and using blob urls, or if the asset is small enough, read as a data uri. Don't forget that blob urls needs to be released when it's not being used anymore. If you're using a large asset like a video file, then there is no "good" workaround available afaik. I can't really give any timeline on when a proper solution will be made available but it is on our radar now. |
Hi breautek, its been long time since last time i tried using cached file on ios, there's been new implementation or have you implemented new functionality about this problem? Thank you for your patience |
This would be specific to iOS but I've been told that since the addition of schemes on iOS there is a It's not ideal since you would have to do a platform check but you could try it as a work around. I'm not familiar with the API, but I believe it would work something like: let myImage = document.getElementById('myImage');
myImage.src = WkWebView.convertFilePath(theFilePath); |
Hi breautek, today i tested the app on IOS Simulator and it works fine, but when i build the app and install it on real devices (iPhone 13 Pro Max 18.2.1) i got the problem, i cant figure out whats its going on. And on this path i can write/read file without any problem and they load everywhere on DOM. While the path on real device is: And on this path i can write without problem but i didnt see it when i load it on dom. I also tryed add a reader object:
and the result of console.log of reader.onloadend is: Also tryed using the workaround u gave me with WkWebView.convertFilePath(theFilePath); but i didnt understand how to use it. |
This looks like it worked as intended, it has an ArrayBuffer filled with bytes. The array buffer alone isn't usable but you can wrap it around a
Using WkWebView.convertFilePath(theFilePath); is definitely a better path. The output of Suppose you had a loadCachedVideo(v) {
if (!v) {
console.error("Il parametro 'v' è vuoto.");
return null;
}
const videoUrl = this.cacheDirectory + this.getFileName(v);
console.log('video url: ' + videoUrl);
window.resolveLocalFileSystemURL(videoUrl, (fileEntry) => {
const videoElement = document.getElementByID("myVideo");
videoElement.src = fileEntry.toURL();
videoElement.play();
});
}); Note that I'd recommend using file plugin 8.1.3 as it contains fixes surrounding This issue should be fixed by This issue should be fixed by #642 if you can confirm (just missed it when authoring the PR) but would be great if you can confirm. |
Hi I'have checked the fix u linked to me, and i looked that you store cache file on tmp folder, so i tryed using tempDirectory on cordova.file instead of dataDirectory and it worked as should without changing anything. I assume that folder Library/NoCache have no enaugh permission on IOS to load on DOM. Could you please try saving and using file as u did on #642 but using Library/NoCache folder? Cause the problem of using tmp folder is that is not persistent, so when i close the app i lose all my cached data, and should be downloaded each time users would use this app ps. im not currently using scheme, im using the default scheme which return me using .toURL() the default file:// |
There are known issues surrounding using
WKWebKit by default (and for security reasons) will only load content within the read-only application content. That is content that is packaged shipped with the ios binary. Everything outside of this directly is considered outside of the "sandbox", which includes the app's writable data directories. The If you can't switch to schemes, then using the ArrayBuffer / Blob url method is the only other way to load videos into the DOM, since you're bypassing WkWebkit restrictions at this point and it's the safest way to do that. You'll need to maintain state to determine when a particular video blob url is no longer used and can be freed to avoid memory leaks. Using SchemesIt would be recommended to switch to schemes if possible, it has several other advantages besides enabling DOM urls. This can be done by adding the scheme and hostname preferences in your <widget ...>
...
<platform name="ios">
<preference name="scheme" value="app" />
<preference name="hostname" value="localhost" />
...
</platform>
</widget> The main things to know when switching is doing this will cause your If you don't use the web storage containers then it should be pretty safe for you to switch to schemes. You're free to choose whatever scheme and hostname you like, but there is a limitation and you cannot choose any scheme that the
The temp folder should only be cleared for 3 reasons:
Otherwise the temp directory is persistent. Apache plugins that does data writes tends to choose the cache/temp directory because the plugin makes no assumptions and leaves it to the app to decide what it should do with the file. So if the file should be "more" persistent, then the application should move the file to the data directory using the file plugin's APIs. Do note that user's can still request app data to be cleared as well. I'm closing this issue because I believe I have a good enough understanding of your environment now and I don't believe there is a bug that Cordova can take action on. If you have further issues using |
Versions:
Description:
I am experiencing an issue with downloading and accessing media files on iOS 17.5.1 using Cordova. The code works perfectly on Android devices, but on iOS, the files are downloaded but cannot be accessed or played.
Steps to Reproduce:
Current Behavior:
On iOS, the files are downloaded successfully, but when attempting to access or play these files, the app fails to locate the files, and they appear to be missing or inaccessible.
Expected Behavior:
The downloaded files should be accessible and playable from the cache directory, similar to the behavior observed on Android devices.
Relevant Code:
setDialog(
"E' necessario scaricare i contenuti audio/video, vuoi continuare?",
"yes-no",
(answer) => {
if (answer === "yes") {
this.downloadMediaFiles();
}
}
);
getCacheDirectoryPath() {
// Ottieni il percorso della directory di cache
window.resolveLocalFileSystemURL(cordova.file.dataDirectory, (dirEntry) => {
this.cacheDirectory = dirEntry.toURL();
console.log("Cache directory: " + this.cacheDirectory);
}, (error) => {
console.error("Errore nel risolvere il file system: " + error.toString());
});
}
async downloadMediaFiles() {
this.downloadProgress = 0;
this.downloadMessage =
Scaricamento di 0/${this.mediaFiles.length} file
;for (let i = 0; i < this.mediaFiles.length; i++) {
await this.downloadFile(this.server_base_path + this.mediaFiles[i]);
this.downloadProgress = ((i + 1) / this.mediaFiles.length) * 100;
this.downloadMessage =
Scaricamento di ${i + 1}/${this.mediaFiles.length} file
;}
this.downloadMessage = "Download completato!";
localStorage.setItem('downloadedMediaFiles', JSON.stringify(this.mediaFiles));
setTimeout(() => {
this.showDownloadDialog = false;
}, 300);
}
async downloadFile(url) {
console.log("Download URL:", url);
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error('Network response was not ok');
}
const blob = await response.blob();
const fileName = url.split('/').pop();
console.log("File name:", fileName);
} catch (error) {
console.error("Errore nel download del file: " + error.toString());
}
}
video source are build like this:
<video preload="auto" playinline="" autoplay="" controls="" controlslist="nofullscreen"><source src="file:///var/mobile/Containers/Data/Application/(APP_ID)/Library/NoCloud/(FILENAME).mp4" type="video/mp4"></video>
Observations:
Possible Causes:
Any insights or suggestions on how to resolve this issue would be greatly appreciated. Specifically, if there are known issues with cordova-plugin-file on iOS 17.5.1 or if additional configurations are required, please let me know.
The text was updated successfully, but these errors were encountered: