ios 8:捆绑路径更改

dat*_*inc 12 objective-c ios

我有一个iOS应用程序,它存储文件在数据库和生成的html文档中的绝对路径.我刚刚将我的iPhone更新到iOS 8,现在当我运行应用程序时,似乎应用程序安装在每个重新编译的不同目录中.例如,在第一次构建/运行[[NSBundle mainBundle] bundlePath]上,在下一次构建/运行时返回不同的内容.到底是怎么回事?这是Apple的新功能吗?

更新:已创建错误报告

代码示例:

如果我在多个构建/运行中运行以下行,那么每次都会得到不同的结果.

#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];
Run Code Online (Sandbox Code Playgroud)

多次运行时输出看起来像这样

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
Run Code Online (Sandbox Code Playgroud)

完全披露:在我的应用程序中,用户导入具有资源的网页(ePub).资源与网页一起存储.该网页还访问属于应用程序包的资源.为了实现这一点,当我加载网页时,基本URL被设置为网页所在的目录,并且通过绝对文件路径访问包资源.现在,每次更新时文件路径都会发生变化.我尝试创建捆绑资源的符号链接,但也无法进行后续更新.

lia*_*ols 18

在iOS 8中,应用程序容器的文件系统布局已更改.应用程序及其内容不再存储在一个根目录中.

来自iOS 8发行说明:

应用程序容器的文件系统布局已在磁盘上更改.而不是依赖于硬编码的目录结构,使用该类的 NSSearchPathForDirectoriesInDomains函数或 URLForDirectory:inDomain:appropriateForURL:create:error:方法 NSFileManager.请参见访问文件和目录中的文件系统编程指南.

这不是一个错误.确保使用推荐的API(来自上面的引用),你就不会有问题.

因此,如果您尝试访问添加到项目中的捆绑资源,则可以使用:

[[NSBundle mainBundle] pathForResource:@"resourceName" ofType:@"extension"];
Run Code Online (Sandbox Code Playgroud)

但是如果你想使用你放在文档目录中的东西,你会使用:

[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"resourceName.extension"];
Run Code Online (Sandbox Code Playgroud)


Mad*_*Nik 8

请参阅Apple的技术说明2406

突破性的变化是

从iOS 8开始,Documents和Library目录不再是应用程序包的兄弟.

不要将完整路径/ URL存储到您的文档中.存储文件名,并始终使用建议的方法生成完整路径/ URL.

获取DocumentsDirectory URL

// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
Run Code Online (Sandbox Code Playgroud)

然后从url获取路径并附加文件名以生成完整路径.