xcode: How to save audio file after recording audio using AVFoundation

I browsed through all kinds of post related to this topic but the answers just do not really help. I used this tutorial to implement recording of audio files and playback. What seems to be missing is how to save the record permanently. When I exit my app the sound file is there but nothing is in it. I don’t even know if it is saving the rocerd or just creating the file.
Here is a code sample:

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [dirPaths objectAtIndex:0];
NSString *soundFilePath = [docsDir
                               stringByAppendingPathComponent:@"tmpSound.caf"];

tempRecFile = [NSURL fileURLWithPath:soundFilePath];

NSDictionary *recSettings = [NSDictionary 
                                    dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithInt:AVAudioQualityMin],
                                    AVEncoderAudioQualityKey,
                                    [NSNumber numberWithInt:16], 
                                    AVEncoderBitRateKey,
                                    [NSNumber numberWithInt: 2], 
                                    AVNumberOfChannelsKey,
                                    [NSNumber numberWithFloat:44100.0], 
                                    AVSampleRateKey,
                                    nil];

recorder = [[AVAudioRecorder alloc] initWithURL:tempRecFile settings:recSettings error:nil];
[recorder setDelegate:self];
[recorder prepareToRecord];
[recorder record];

I saw a possible solution to this problem here but since I’m new to iOS I do not really get it or it is just does not working for me.

  • Assertion failure in -[UITableView _endCellAnimationsWithContext:
  • How to allow user to pick the image with Swift?
  • Programmatically detect which app store the app was downloaded from
  • How to prevent bold images with UIImageRenderingModeAlwaysTemplate
  • How to add custom code snippets to XCode 4?
  • “Unbalanced calls to begin/end appearance transitions for DetailViewController” when pushing more than one detail view controller
  • Please help and provide a code example. I read the documentation about AVFoundation and other classes but with no positive results.

    SOS 🙂

    UPDATE
    This is my recording method:

    -(IBAction)recording{
        //***** METHOD for recording
    
        if(isNotRecording){
            isNotRecording = NO;
            [recButton setTitle:@"Stop"  forState:UIControlStateNormal];
            recStateLabel.text = @"Recording";
    
            [recorder setDelegate:self];
            [recorder prepareToRecord];
            [recorder record];
    
        }
        else{
            isNotRecording = YES;
            [recButton setTitle:@"Rec Begin" forState:UIControlStateNormal];
            playButton.hidden = NO;
            recStateLabel.text = @"Not recording";
            [recorder stop];
        }
    
    
    }
    

    This is my viewDidLoad:

    - (void)viewDidLoad
    {
        //record sound test code - start
        isNotRecording = YES;
        //playButton.hidden = YES;
        recStateLabel.text = @"Not recording";
    
        AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    
        [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
    
        [audioSession setActive:YES error:nil];
        //record sound test code -  END
    
        [super viewDidLoad];
        // Do any additional setup after loading the view from its nib.
    
        // code for generating the sound file that is to be saved
        NSArray *dirPaths;
        NSString *docsDir;
    
        dirPaths = NSSearchPathForDirectoriesInDomains(
                                                       NSDocumentDirectory, NSUserDomainMask, YES);
        docsDir = [dirPaths objectAtIndex:0];
        NSString *soundFilePath = [docsDir
                                   stringByAppendingPathComponent:@"sound.caf"];
    
        NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
    
        NSDictionary *recordSettings = [NSDictionary 
                                        dictionaryWithObjectsAndKeys:
                                        [NSNumber numberWithInt:AVAudioQualityMin],
                                        AVEncoderAudioQualityKey,
                                        [NSNumber numberWithInt:16], 
                                        AVEncoderBitRateKey,
                                        [NSNumber numberWithInt: 2], 
                                        AVNumberOfChannelsKey,
                                        [NSNumber numberWithFloat:44100.0], 
                                        AVSampleRateKey,
                                        nil];
    
        NSError *error = nil;
    
        recorder = [[AVAudioRecorder alloc]
                         initWithURL:soundFileURL
                         settings:recordSettings
                         error:&error];
    
        if (error)
        {
            NSLog(@"error: %@", [error localizedDescription]);
    
        } else {
            [recorder prepareToRecord];
        }
    
    }
    

    This is my playBack method:

    -(IBAction)playback{
        //AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:temporaryRecFile error:nil];
        NSError *error;
        // setting the uri of the formed created file
        NSArray *dirPaths;
        NSString *docsDir;
    
    
    
    dirPaths = NSSearchPathForDirectoriesInDomains(
                                                   NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir = [dirPaths objectAtIndex:0];
    NSString *soundFilePath = [docsDir
                               stringByAppendingPathComponent:@"sound.caf"];
    
    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
    
    AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:soundFileURL error:&error];
    
    
    
    [player setNumberOfLoops:0];
    [player prepareToPlay];
    [player setVolume:1];
    [player play];
    NSLog(@"URL je: %@", soundFileURL);
    
    
    //method 2
    if (error)
        NSLog(@"Error: %@", 
              [error localizedDescription]);
    else
    {
    
        [player play];
        if(player.isPlaying==YES)
        {
            NSLog(@"It's playing");
        }
    }
    

    }

    I hopše this makes it clear what I do.
    Any suggestions where I might be wrong?

    3 Solutions Collect From Internet About “xcode: How to save audio file after recording audio using AVFoundation”

    You need to stop recording in order to save the data to the file permanently:

    [recorder stop];
    

    The problem is that when you tell XCode (in the viewDidLoad method) to [recorder prepareToRecord]; it gets rid of the previously recorded audio file. Eliminate that piece of code in the “if” statement and your audio file WILL be saved when you exit and come back in to the app.

    FYI — The “[recorder prepareToRecord]” method creates a fresh audio file, overwriting any previous recorded file.