Je télécharge le fichier vidéo depuis l'URL et l'enregistre dans le répertoire du document avec ce chemin:
let destination: DownloadRequest.DownloadFileDestination = { _, _ in
let pathComponent = "pack\(self.packID)-\(selectRow + 1).mp4"
let directoryURL: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let folderPath: URL = directoryURL.appendingPathComponent("Downloads", isDirectory: true)
let fileURL: URL = folderPath.appendingPathComponent(pathComponent)
return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}
ma vidéo est téléchargée et jouée avec succès. mais il y a un problème, lorsque je reconstruis l'application dans Xcode et essaie de lire la dernière vidéo que j'ai téléchargée, la vidéo n'est pas affichée, et lorsque je télécharge une nouvelle vidéo, cette sauvegarde et la lecture réussissent.
J'ai vu chaque chemin de bundle vidéo, ils sont différents.
1 - fichier: /// Users/myMac/Library/Developer/CoreSimulator/Devices/EAC2F4CE-EA09-46C0-B403-1CE9E24B6822/data/Containers/Data/Application/1D2C1F7B-E627-4898- 91C1-D0AF8D5E0F1E/Documents/Téléchargements/pack7-1.mp4
2 - fichier: /// Users/myMac/Library/Developer/CoreSimulator/Devices/EAC2F4CE-EA09-46C0-B403-1CE9E24B6822/data/Containers/Data/Application/F950E9A5-C9F3-4B8C-BCF5-647EEC233CEE/Documents/Téléchargements/pack7-3.mp4
Maintenant, ma question est, lorsque nous mettons à jour l'application à partir de l'App Store, cela signifie une réinstallation? Ce chemin change-t-il?
comment résoudre ce problème?
iOS 8 et versions ultérieures, l'URL absolue du bac à sable de l'application change à chaque fois que vous relancez l'application. Par conséquent, vous ne devez jamais enregistrer l'URL absolue de la vidéo. Enregistrez le nom de la vidéo et recréez l'URL chaque fois que vous relancez l'application.
let pathComponent = "pack\(self.packID)-\(selectRow + 1).mp4"
let directoryURL: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let folderPath: URL = directoryURL.appendingPathComponent("Downloads", isDirectory: true)
let fileURL: URL = folderPath.appendingPathComponent(pathComponent)
Une fois que vous avez fileURL
recherchez le fichier et vous trouverez le fichier téléchargé lors du lancement précédent.
iOS crée un nouveau Sandbox pour l'application à chaque fois que l'utilisateur lance l'application. Par conséquent, l'URL absolue sera très. Mais iOS se chargera de configurer tous les dossiers et contenus à l'intérieur du Sandbox comme c'était le cas auparavant. Ainsi, bien que l'URL de base de SandBox change, les URL relatives de tout le contenu resteront intactes.
Par conséquent, il est conseillé de ne jamais enregistrer l'URL absolue dans un dossier :) J'espère que cela aide
Je suggère d'utiliser un signet. Consultez la section Localisation de fichiers à l'aide de signets dans l'article suivant: https://developer.Apple.com/library/archive/documentation /FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//Apple_ref/doc/uid/TP40010672-CH
Modifier:
Certaines parties pertinentes du document lié, juste au cas où:
Important : Bien qu'elles soient sûres à utiliser pendant que votre application est en cours d'exécution, les URL de référence de fichier ne sont pas sécurisées à stocker et à réutiliser entre les lancements de votre application car un fichier est L'ID peut changer si le système est redémarré. Si vous souhaitez stocker l'emplacement d'un fichier de manière persistante entre les lancements de votre application, créez un signet comme décrit dans Localisation des fichiers à l'aide de signets.
J'ai une application qui utilise beaucoup de gestion de fichiers, j'ai donc créé la méthode suivante dans une catégorie NSURL pour renvoyer les données de signet pour une URL donnée.
- (NSData*)defaultBookmark
{
NSError* error = nil;
NSData* bookmarkData = [self bookmarkDataWithOptions:NSURLBookmarkCreationSuitableForBookmarkFile
includingResourceValuesForKeys:nil
relativeToURL:nil
error:&error];
if (error != nil)
{
NSLog(@"error creating bookmark for url '%@': %@", self, error);
}
return bookmarkData;
}
Pour créer un objet NSURL à partir de données de signet, utilisez quelque chose comme:
NSError* error = nil;
BOOL isStale = NO;
NSURL* url = [NSURL URLByResolvingBookmarkData:bookmarkData
options:NSURLBookmarkResolutionWithoutUI
relativeToURL:nil
bookmarkDataIsStale:&isStale
error:&error];
if (error != nil || url == nil)
{
NSLog(@"Error restoring url from bookmark: %@", error);
}
else
{
// use url to load file
...
}