井原プロダクトのBLOG

Since 2013。個人でアプリ作っています。

「練習カメラ」アプデ:UIImagePickerで録画ファイルを消すと次回起動できなくなる

ちょっとほったらかしにしていたら、動作不具合が起きていて焦ってアプデしました。アプデといっても、ソースコードもほぼ書き直して作り直し。そんなに難しくないだろうと思ったらやっぱり結構ハマりました。しばらく、このお話をします。まずは、撮ったファイルを消すお話。

このカメラアプリは、楽器やゴルフなどを録画してチェックを繰り返す目的としているものなので、録画したファイルを保存しないようにしています。保存したいときだけ、保存ボタンをタップする仕組み。そうすると、録画=>再生=>録画=>再生と繰り返すことになるのですが、これほっとくと録画ファイルがどんどんどんどん溜まってしまいにはストレージを食いつぶしてしまいます。なので、保存しないファイルはこまめに消さないといけない。というわけで、こちらがその事を書いたエントリーです。

iPhone動画カメラアプリは、撮ったファイルが自動で消えない - 自宅プログラマーの憂鬱

だがしかし、、、今回の不具合はここで起きていました。何と、撮ったファイルを消した状態で再度UIPickerControllerを [self presentViewController:imagePicker animated:NO completion:nil]; とやると、前回録画したファイル名と一緒にFile not found! エラーが出てクラッシュします。いや、もう、これから新しい録画したいんだけどさ、、、。

というわけで、消しちゃいけなくなっていることがわかりました。でも消さないとフォルダーは膨らんでいくわけだし、、。というわけで、溜まっているVideoは消すけど、さっき撮ったのだけは残すという処理に変更。

NSString *pathToVideo;

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    NSURL *videoURL  = [info valueForKey:UIImagePickerControllerMediaURL];
    pathToVideo = [videoURL path];
    //PickerControllerを閉じる
    [self dismissViewControllerAnimated:YES completion:nil];
    以下略
}

-(void) deleteFile
{
    NSLog (@"videoPath=%@", pathToVideo);
    //録画ファイルを消す
    NSString *tempDir = [self temporaryDirectory];
    NSArray *imgFileNames = [self fileNamesAtDirectoryPath:[self temporaryDirectory] extension:@"MOV"];
    for (NSString *fileName in imgFileNames) {
        NSLog (@"消去 %@", fileName);
        NSString *filePath = [tempDir stringByAppendingPathComponent:fileName];
        if   (![filePath isEqualToString:pathToVideo]){
            [self removeFilePath:filePath];
        }
    }
    imgFileNames = [self fileNamesAtDirectoryPath:[self temporaryDirectory] extension:@"MOV"];
    for (NSString *fileName in imgFileNames) {
        NSLog (@"まだ残ってる %@", fileName);
    }
}

- (BOOL)removeFilePath:(NSString*)path
{
    NSFileManager *fileManager = [[NSFileManager alloc] init];
    return [fileManager removeItemAtPath:path error:NULL];
}


これで解決。やれやれ。