2

アプリのドキュメント ディレクトリに画像 (JPEG) とテキスト ファイルを保存するアプリがあります。xcode シミュレーターと 2 台の 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];

次に、画像/ファイル XXXX.jpg に起因する文字列を self.docsPath に追加します。

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 を生成するたびにアプリを起動するたびに。そのため、フル パスで画像を保存した場合、2 回目のアプリの起動で失われる可能性があります。シミュレーターまたは xcode に接続されたデバイスでテストする場合、この効果は表示されません。プラグを差し込んでアプリを実行するだけで、この問題を自分で確認することもできます。

そのため、画像をそのパスで保存する代わりに、ドキュメント ディレクトリにフォルダーを作成し、そこに画像を保存します。パス生成の場合、以下のコードを記述できます (ただし、必ず imageID などの特定の ID で画像を保存し、その 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 に答える