web-dev-qa-db-fra.com

Changement du chemin d'accès au répertoire du document lors de la reconstruction de l'application

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?

14
ava

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

35
Sandeep Bhandari

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
        ...
    }
4
D. Mika