我有一个应用程序可以将图像(JPEG)和文本文件保存在应用程序的文档目录中。我已经在xcode模拟器和两个iPhone(4和5,分别运行ios 7.1和8.1)上进行了测试,它完全按预期工作,数据保存得很好。
然而,在将其提交到应用程序商店后,测试应用程序的用户(使用iphone 6,ios 8.1)发现保存的数据每20分钟左右就会丢失一次。有谁知道这是为什么以及如何解决这个问题?
将文件标记为“不备份”会解决问题吗?
作为参考,正在保存NSUserDefaults中保存的数据。
提前致谢。
EDIT ----
我应该提到我正在使用以下方法搜索文档目录:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
self.docsPath = [paths objectAtIndex:0];
然后我将self.docsPath附加到属于图像/文件的字符串XXXX.jpg:
self.imgPath = [self.fileName stringByAppendingString:@".jpg"];
self.tempPhotoPath = [self.docsPath stringByAppendingPathComponent:self.imgPath];
我还应该澄清一下,该应用程序在iPhone 4/5上正常运行,从xcode上拔下并运行appstore下载的应用程序版本。到目前为止,在调查中,特别是我遇到问题的iPhone 6,据我所知,它只是每20分钟左右清理一次文件目录。
答案 0 :(得分:5)
,每当应用程序每次生成新的沙箱ID时启动。因此,您已使用完整路径保存图像,然后它可能会在第二次应用启动时丢失。如果您在连接到xcode的模拟器或设备上进行测试,则不会显示此效果。只需插上并运行你的应用程序,你也可以看到这个问题。
因此,不是使用其路径保存图像,只需在文档目录中创建一个文件夹并将图像保存在那里。对于路径生成,您可以在下面编写代码:(但请确保使用特定ID保存图像,如imageID,然后从该imageID获取相同的图像)。
- (NSString *)documentsPathForFileName:(NSString *)name folder:(NSString*)folderName{
return [[self pathToPatientPhotoFolder:folderName] stringByAppendingPathComponent:name];
}
- (NSString *)pathToPatientPhotoFolder:(NSString *)folderName {
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES) lastObject];
NSString *patientPhotoFolder = [documentsDirectory stringByAppendingPathComponent:folderName];
// Create the folder if necessary
BOOL isDir = NO;
NSFileManager *fileManager = [[NSFileManager alloc] init];
if (![fileManager fileExistsAtPath:patientPhotoFolder
isDirectory:&isDir] && isDir == NO) {
[fileManager createDirectoryAtPath:patientPhotoFolder
withIntermediateDirectories:NO
attributes:nil
error:nil];
}
return patientPhotoFolder;
}
NSURL *urla = [NSURL URLWithString:[NSString stringWithFormat:@"%@",[self.imagearray objectAtIndex:indexPath.item]]];// imagearray for array of image url from server
NSString *thumbnailCacheKey = [NSString stringWithFormat:@"thumb-%@",[self.imageIDarray objectAtIndex:indexPath.item]];//first try to check thumb-<my image id> is exist or not.
UIImage *image = [UIImage imageWithContentsOfFile:[self documentsPathForFileName:thumbnailCacheKey folder:@"thumb"]];//this will check thumb-<my image id> in ur sandbox
if (!image){
UIImage *imageToSave = //
NSString *stringPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"thumb"];
// New Folder is your folder name
NSError *error = nil;
if (![[NSFileManager defaultManager] fileExistsAtPath:stringPath])
[[NSFileManager defaultManager] createDirectoryAtPath:stringPath withIntermediateDirectories:NO attributes:nil error:&error];
NSString *filePath = [stringPath stringByAppendingPathComponent:thumbnailCacheKey];
NSData *pngData = UIImageJPEGRepresentation(image, 0.8);
[pngData writeToFile:filePath atomically:YES];
}
else{
yourimageView.image = image;
}