Grabar file de audio y save localmente en iPhone

He estado buscando por todo el lugar una respuesta a esto, pero no puedo encontrar exactamente lo que necesito. Básicamente en mi aplicación estoy grabando voz en un file de audio (como la aplicación iOS Voice Memo) y luego me gustaría savelo en el directory de documentos local. Por alguna razón, la URL que se me entrega con el file grabado expira la próxima vez que lance la aplicación. Además, aunque no lo hiciera, si grabo dos veces, la segunda URL del file obtendrá la misma URL que la primera, así que estoy perdiendo el primer file.

Grabando de esta manera:

[audioRecorder record]; 

Donde: AVAudioRecorder * audioRecorder;

Jugar está bien:

  [audioPlayer play]; 

Dónde: AVAudioPlayer * audioPlayer;

¿Cuál es la mejor forma de grabar memo de voz y savelo en el disco local del iPhone?

Gracias.

Actualizar:

Intenté usar este código:

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName]; BOOL status = [data writeToFile:filePath atomically:YES]; 

Con los datos que son los datos de mi propiedad AVAudioPlayer NSData, pero BOOL obtiene 0 y no sé por qué.

Devuelve la date y hora actual que usamos como nombre de file de sonido.

 - (NSString *) dateString { // return a formatted string for a file name NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"ddMMMYY_hhmmssa"; return [[formatter stringFromDate:[NSDate date]] stringByAppendingString:@".aif"]; } 

Configuración de la session de audio

 - (BOOL) startAudioSession { // Prepare the audio session NSError *error; AVAudioSession *session = [AVAudioSession shanetworkingInstance]; if (![session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]) { NSLog(@"Error setting session category: %@", error.localizedFailureReason); return NO; } if (![session setActive:YES error:&error]) { NSLog(@"Error activating audio session: %@", error.localizedFailureReason); return NO; } return session.inputIsAvailable; } 

Grabar sonido..

 - (BOOL) record { NSError *error; // Recording settings NSMutableDictionary *settings = [NSMutableDictionary dictionary]; [settings setValue: [NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; [settings setValue: [NSNumber numberWithFloat:8000.0] forKey:AVSampleRateKey]; [settings setValue: [NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey]; [settings setValue: [NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; [settings setValue: [NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; [settings setValue: [NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; [settings setValue: [NSNumber numberWithInt: AVAudioQualityMax] forKey:AVEncoderAudioQualityKey]; NSArray *searchPaths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentPath_ = [searchPaths objectAtIndex: 0]; NSString *pathToSave = [documentPath_ stringByAppendingPathComponent:[self dateString]]; // File URL NSURL *url = [NSURL fileURLWithPath:pathToSave];//FILEPATH]; // Create recorder recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error]; if (!recorder) { NSLog(@"Error establishing recorder: %@", error.localizedFailureReason); return NO; } // Initialize degate, metering, etc. recorder.delegate = self; recorder.meteringEnabled = YES; //self.title = @"0:00"; if (![recorder prepareToRecord]) { NSLog(@"Error: Prepare to record failed"); //[self say:@"Error while preparing recording"]; return NO; } if (![recorder record]) { NSLog(@"Error: Record failed"); // [self say:@"Error while attempting to record audio"]; return NO; } // Set a timer to monitor levels, current time timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(updateMeters) userInfo:nil repeats:YES]; return YES; } 

Reproducir sonido … Recuperar desde directiory del documento

 -(void)play { NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentPath_ = [searchPaths objectAtIndex: 0]; NSFileManager *fileManager = [NSFileManager defaultManager]; if ([fileManager fileExistsAtPath:[self recordingFolder]]) { arrayListOfRecordSound=[[NSMutableArray alloc]initWithArray:[fileManager contentsOfDirectoryAtPath:documentPath_ error:nil]]; NSLog(@"====%@",arrayListOfRecordSound); } NSString *selectedSound = [documentPath_ stringByAppendingPathComponent:[arrayListOfRecordSound objectAtIndex:0]]; NSURL *url =[NSURL fileURLWithPath:selectedSound]; //Start playback player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; if (!player) { NSLog(@"Error establishing player for %@: %@", recorder.url, error.localizedFailureReason); return; } player.delegate = self; // Change audio session for playback if (![[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryPlayback error:&error]) { NSLog(@"Error updating audio session: %@", error.localizedFailureReason); return; } self.title = @"Playing back recording..."; [player prepareToPlay]; [player play]; } 

para de grabar

 - (void) stopRecording { // This causes the didFinishRecording delegate method to fire [recorder stop]; } 

continuarRecordar

 - (void) continueRecording { // resume from a paused recording [recorder record]; } 

pauseRecording

  - (void) pauseRecording { // pause an ongoing recording [recorder pause]; }