ios 8: Bundle changements de chemin d'accès
J'ai une application iOS qui stocke le chemin absolu des fichiers dans une base de données et généré des documents html. J'ai récemment mis à jour mon iPhone pour iOS 8 et maintenant, lorsque j'ai jamais exécuter l'application, il semble que l'application est installée dans un répertoire différent de tous les re-compiler. Par exemple le premier build/run [[NSBundle mainBundle] bundlePath] renvoie quelque chose de différent sur la prochaine build/run. Ce qui se passe? Est-ce une nouvelle fonctionnalité d'Apple?
Mise à jour: Un rapport de bug a été créé
Exemple de Code:
Si j'exécute la ligne suivante au cours de plusieurs build/pistes, puis je vais obtenir un résultat différent à chaque fois.
#define kOLD_PATH @"oldPath"
NSString* newPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
NSString* oldPath = [[NSUserDefaults standardUserDefaults] objectForKey:kOLD_PATH];
NSLog(@"New Path: %@", newPath);
NSLog(@"Old Path: %@", oldPath);
NSLog(@"Result: %@", [oldPath isEqualToString:newPath] ? @"Same" : @"Changed");
[[NSUserDefaults standardUserDefaults] setObject:newPath forKey:kOLD_PATH];
[[NSUserDefaults standardUserDefaults] synchronize];
La sortie ressemble à ceci sur plusieurs pistes
New Path: /var/mobile/Containers/Data/Application/4FFCE2CB-580D-409A-90CB-EF2B8A1FB653/Library
Old Path: /var/mobile/Containers/Data/Application/B038B2DA-F85D-4E18-A5F1-8635834EC454/Library
Result: Changed
Divulgation complète: Dans mon application à l'utilisateur d'importer une page web (ePub) qui a des ressources. Les ressources sont stockées avec la page web. La page web accède également à des ressources qui font partie de l'app bundle. Pour atteindre cet quand je charge la page web à l'url de base est définie sur le répertoire que la page web est en et le bundle de ressources sont accessibles via absolue chemins d'accès aux fichiers. Maintenant que les chemins de fichiers changer à chaque mise à jour c'est cassé. J'ai essayé de créer des liens symboliques vers les ressources de module, mais qui ne l'onu mises à jour subséquentes.
OriginalL'auteur datinc | 2014-09-17
Vous devez vous connecter pour publier un commentaire.
Consulter la Note Technique 2406 par Apple
La modification de rupture est
N'entreposez pas de chemin d'accès complet de l'URL à vos documents. Stocker le nom du fichier et toujours de générer chemin d'accès complet/URL avec la méthode recommandée.
Obtenir le DocumentsDirectory URL
Ensuite, vous obtenez le chemin de l'url et ajouter le nom du fichier à générer chemin d'accès complet.
OriginalL'auteur MadNik
Dans iOS 8, Le système de fichiers de mise en page de conteneurs d'applications, a changé. Les Applications et leur contenu ne sont plus stockés dans un répertoire racine.
De l'iOS 8 Notes de Version:
Ce n'est pas un bug. Assurez-vous d'utiliser le recommandé Api (à partir de la citation ci-dessus) et vous n'aurez pas un problème.
Donc, Si vous essayez d'accéder à une groupés ressource que vous avez ajouté au projet, vous pouvez utiliser:
Mais si vous voulez utiliser quelque chose que vous mettez dans le répertoire documents, vous pouvez utiliser:
mon edition de l'aide?
Pas vraiment. La raison pourquoi j'ai des chemins absolus dans le code html généré est parce que les scripts j'utilise ne sont pas situés dans l'URL de base. Le html dépend de contenu généré par l'utilisateur (css, images, etc) et de copier les scripts dans chaque html de base du chemin semble mauvais. Donc les scripts html de référence le fichier absolument. Toutefois, maintenant que le chemin de modifications à chaque mise à jour.
J'ai ajouté une divulgation complète de la section de la question, de sorte que vous pouvez vraiment voir exactement le problème que j'ai.
Je peux aller jusqu'à l'iPhone Simulateur de chemin d'accès à mon mac, je ne peux pas en mesure de voir iOS 8. Comment puis-je obtenir iOS 8 chemin?.
OriginalL'auteur liamnichols
ne sais pas si vous avez résolu votre problème, mais ce lien est possible de la réponse.
https://developer.apple.com/library/prerelease/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW10
De Localisation Des Fichiers À L'Aide De Signets
Quelques lignes avant de cette section dans la page, c'est ce texte:
"Important: Bien qu'ils sont sûrs à utiliser pendant que votre application est en cours d'exécution, le fichier de référence les Url ne sont pas sûrs pour stocker et réutiliser entre les lancements de votre application, car un fichier ID peut changer si le système est redémarré. Si vous souhaitez stocker l'emplacement d'un fichier de manière persistante entre le lancement de votre application, créez un signet comme décrit dans la Localisation des Fichiers à l'Aide de Signets."
Au revoir.
OriginalL'auteur mylaneza
Je pense que le chemin d'accès différent pour chacun de créer et d'exécuter est la manière de ce qui se passe dans le simulateur iOS. Il n'est pas un problème.
/var/mobile/Conteneurs/Data/Application/4FFCE2CB-580D-409A-90CB-EF2B8A1FB653/Bibliothèque
/var/mobile/Conteneurs/Data/Application/B038B2DA-F85D-4E18-A5F1-8635834EC454/Bibliothèque
J'ai trouvé même si vous utilisez la méthode recommandée
Les résultats sont les mêmes. Chemin d'accès différent pour chaque build & run.
OriginalL'auteur arango_86