4 votes

Que se passe-t-il avec les fichiers locaux sur iOS lors de la mise à jour de l'application?

Mon application iOS écrit dans des fichiers locaux à :

/var/mobile/Containers/Data/Application/A.../Library/a.txt

Lorsque mon application se met à jour, elle obtient un nouvel identifiant de conteneur d'application et un dossier :

/var/mobile/Containers/Data/Application/B...

Que se passe-t-il avec tous les fichiers que j'ai écrits dans le conteneur A ?

Y a-t-il un "hook de mise à jour" qui me permettra de copier tous les fichiers du conteneur "A" vers le chemin "B" ?

La nouvelle version de l'application (B) peut-elle lire les fichiers des anciennes versions (A) ?

Y a-t-il une documentation sur ce qui se passe sur le système de fichiers pendant les mises à jour ?

Est-il possible de récupérer des fichiers du conteneur A après l'installation de B ?

7voto

BhargavR Points 909

Lorsque vous mettez à jour une application, en changeant son numéro de version dans le fichier .plist, iOS crée un nouveau répertoire pour cette application avec un nom hexadécimal différent et il copie tous les fichiers dans les nouveaux répertoires. Maintenant, si vous utilisez les chemins absolus pour obtenir les détails des fichiers à partir des répertoires, alors ces chemins seront incorrects et vous n'obtiendrez pas les détails des fichiers.

J'ai simplement essayé ceci dans le simulateur. J'ai créé une fonction comme ci-dessous qui renverra l'URL du répertoire des documents

func getDocumentsDirectory() -> URL {

    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentsDirectory = paths[0]
    return documentsDirectory
}

J'ai appelé cette fonction depuis didFinishLaunchingWithOptions dans l'app delegate lorsque le numéro de version était 1.0 et il m'a renvoyé le chemin ci-dessous :

file:///Users/BhargavRathod/Library/Developer/CoreSimulator/Devices/3082611F-BCCA-4D17-B390-E0EF4CA454DA/data/Containers/Data/Application/72759097-38F3-4292-825E-1D2343219973/Documents/

Lorsque j'ai mis à jour le numéro de version à 1.1, cela m'a renvoyé le nouveau chemin comme suit :

file:///Users/BhargavRathod/Library/Developer/CoreSimulator/Devices/3082611F-BCCA-4D17-B390-E0EF4CA454DA/data/Containers/Data/Application/72DC31E9-C32F-42CC-8449-F1946ADB1018/Documents/

Donc si vous utilisez un chemin absolu pour accéder à un fichier dans le répertoire de documents, ce n'est pas une bonne pratique. Vous pouvez simplement enregistrer le nom du fichier (ou le chemin relatif après le répertoire des documents) et chaque fois que l'accès à ce nom de fichier est requis, récupérez le nom de fichier et ajoutez-le après le chemin du répertoire des documents pour accéder au fichier.

J'espère que cela vous sera utile.

3voto

matt Points 60113

Mon application iOS écrit dans des fichiers locaux à: /var/mobile/Containers/Data/Application/A.../Library/a.txt

D'accord, arrêtez-vous là. C'est faux.

Votre application a sa propre sandbox. Cette sandbox persiste pour toujours, à travers les mises à jour, tant que votre application garde son identifiant de Bundle, et tant que l'utilisateur ne supprime pas l'application.

Vous n'avez donc pas besoin de connaître ou de penser au chemin absolu complet où se trouve votre fichier. Tout ce que vous savez, et tout ce que vous devez savoir, c'est qu'il se trouve dans le répertoire Library de la sandbox de votre application. À tout moment, vous pouvez obtenir l'URL du répertoire Library en utilisant son chemin de recherche :

https://developer.apple.com/documentation/foundation/filemanager/searchpathdirectory/librarydirectory

Et c'est là que le fichier se trouvera toujours. Tant que vous demandez au FileManager le répertoire Library de votre application et le fichier a.txt à l'intérieur, vous trouverez toujours le même fichier, indépendamment de toutes les mises à jour, tant que l'utilisateur ne supprime pas réellement votre application (car cela supprime la sandbox).

Pouvez-vous expliquer ce qui se passe avec les fichiers?

Rien. Ils restent où ils sont dans la sandbox. L'URL absolue de la sandbox peut changer, mais vos fichiers ne sont pas affectés.

comment conserver les fichiers écrits par la version précédente de l'application

Ils sont conservés automatiquement. Vous n'avez rien à faire.


(Cela dit, gardez à l'esprit que si vous soumettez une application avec un identifiant de bundle différent, ce n'est pas une nouvelle version de votre application. C'est une application totalement différente. Dans ce cas, vous auriez un problème très différent à résoudre. Ce serait comme tout autre problème de communication de fichiers d'une application à une autre. Vous devriez mettre les fichiers dans un emplacement commun, les rendre disponibles via le Document Browser, les rendre exportables par l'utilisateur, ou quelque chose du genre.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X