2

我有一个应用程序,可以在应用程序的文档目录中保存图像(JPEG)和文本文件。我已经在 xcode 模拟器和两部 iPhone(4 和 5,分别运行 ios 7.1 和 8.1)上对其进行了测试,它完全按预期工作,并且数据保存得很好。

然而,在将其提交到应用商店后,测试应用的用户(使用 iphone 6、ios 8.1)发现保存的数据每 20 分钟左右丢失一次。有谁知道这是为什么以及如何解决这个问题?

将文件标记为不备份会解决问题吗?

作为参考,保存在 NSUserDefaults 中的数据将被保留。

提前致谢。

编辑 - -

我应该提到我正在使用以下方法搜索文档目录:

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 分钟左右清除一次文档目录。

4

1 回答 1

5

在 Apple 新文档中,每当应用程序启动时,它都会生成新的沙箱 id。因此,如果您使用完整路径保存了图像,那么它可能会在第二次应用启动时丢失。如果您在模拟器或连接到 xcode 的设备上进行测试,它将不会显示此效果。只需拔出并运行您的应用程序,您也可以自己查看此问题。

因此,不要使用其路径保存图像,只需在 Document 目录中创建一个文件夹并将图像保存在那里。对于路径生成,您可以编写以下代码:(但请确保使用特定 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;
}
于 2015-02-26T11:06:07.097 回答