【发布时间】:2015-01-28 17:42:52
【问题描述】:
我将一些文件存储在 iOS 应用程序的 Library 目录中,使用以下方法构建它。最后,我可以打电话给[MyClass dataDirectory] 来处理我的文件,一切都很好。然而,我最近发现一些文件似乎神秘地从这个目录中消失了。根据the documentation,情况不应该如此。这是存储持久文件的安全地方吗?
该目录的控制台输出为:~/var/mobile/Containers/Data/Application/{id}/Library/Data
+ (NSString*)libraryDirectory
{
return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
}
+ (NSString*)dataDirectory
{
NSString* dir = [[self libraryDirectory] stringByAppendingPathComponent:@"Data"];
BOOL isDir=NO;
NSError * error = nil;
NSFileManager *fileManager = [NSFileManager new];
if (![fileManager fileExistsAtPath:dir isDirectory:&isDir] && isDir)
{
[[NSFileManager defaultManager] createDirectoryAtPath:dir
withIntermediateDirectories:YES
attributes:nil
error:&error];
}
[self addSkipBackupAttributeToItemAtURL:[NSURL fileURLWithPath:dir isDirectory:YES]];
if (error != nil) {
DDLogError(@"Fatal error creating ~/Library/Data directory: %@", error);
}
return dir;
}
还有跳过方法:
+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
if ([[NSFileManager defaultManager] fileExistsAtPath:[URL path]])
{
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
NSError *error = nil;
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
forKey: NSURLIsExcludedFromBackupKey error: &error];
if(!success){
DDLogError(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
}
return success;
}
return YES;
}
【问题讨论】:
-
你在 iOS 8 remus 上看到了吗?
-
您的应用程序是否有可能尝试保留从 +libraryDirectory 返回的值?在 iOS 8 中,该目录的完整路径可以在应用程序启动之间更改。
-
每次我引用文件时,我都会调用
+libraryDirectory,所以只要下次应用启动时文件在那个位置,就不会有问题。 -
是的,这就是你应该做的,虽然不是每个人都这样做(咳咳,比如...*咳嗽文件协调咳嗽*)。我会尽快发布您问题的完整答案。
-
很确定我知道你的问题的根源是什么,尽管它仍然很难复制或预测它何时会发生。我会尽快发布一个应该有帮助的答案。
标签: ios objective-c nsdocumentdirectory nslibrarydirectory