保存在<application_home> / Documents中的文件在短时间内丢失</application_home>

时间:2015-02-26 10:48:19

标签: ios xcode ios8.1 nsdocumentdirectory data-loss

我有一个应用程序可以将图像(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分钟左右清理一次文件目录。

1 个答案:

答案 0 :(得分:5)

Apple新文档中的

,每当应用程序每次生成新的沙箱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;
}