我有一个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)
突破性的变化是
从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获取路径并附加文件名以生成完整路径.
| 归档时间: |
|
| 查看次数: |
15154 次 |
| 最近记录: |