2013-06-12 1 views
0

У меня есть запись, работающая во время работы приложения (добавлено аудио в фоновый режим), она будет записываться неограниченное количество раз, и приложение остается активным в фоновом режиме.xcode AVAudioRecorder Как выполнить фоновый снимок каждые 30 минут

Я бы хотел, чтобы приложение оставалось активным в фоновом режиме и записывало 30-секундный звуковой клип каждые 30 минут.

Я пробовал использовать NSTimer в сочетании с методом AVAudioRecorderrecordForDuration:, но приложение уничтожено до того, как NSTimer может стрелять. Есть идеи?

Следующий код работает в фоновом режиме и записывается в течение 5 секунд каждые 5 секунд, но если я увеличил запланированныйTimerWithTimeInterval до 1 минуты, это не сработает.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 



    // retrieve avaudiosession instance 
    _session = [ AVAudioSession sharedInstance]; 
    // set category 
    NSError *errRet; 
    [_session setCategory:AVAudioSessionCategoryPlayAndRecord error:&errRet]; 
    [_session setActive:YES error:&errRet]; 


    NSArray *dirPaths; 
    NSString *docsDir; 

    dirPaths = NSSearchPathForDirectoriesInDomains(
                NSDocumentDirectory, NSUserDomainMask, YES); 
    docsDir = dirPaths[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; 

    _audioRecorder = [[AVAudioRecorder alloc] 
         initWithURL:soundFileURL 
         settings:recordSettings 
         error:&error]; 

    if (error) 
    { 
     NSLog(@"error: %@", [error localizedDescription]); 
    } else { 
     [self recordAudio]; 
     NSTimer* timer; 
     timer=[NSTimer scheduledTimerWithTimeInterval: 10.0 target:self selector:@selector(recordAudio) userInfo:nil repeats: YES]; 
     NSLog(@"timer fired"); 
    } 
} 


- (IBAction)recordAudio{ 

    if (!_audioRecorder.recording) 
    { 
     NSError *errRet; 
     [_session setCategory:AVAudioSessionCategoryRecord error:&errRet]; 
     [_session setActive:YES error:&errRet]; 
     //_play.enabled = NO; 
     [_audioRecorder recordForDuration:5.0]; 
     NSLog(@"Finished Recording"); 
    } 
} 
+0

Пожалуйста, включите часть вашего исходного кода в свой вопрос. –

+0

Это работает, начиная запись каждые 10 секунд в течение 5 секунд, если я увеличиваю запланированныйTimerWithTimeInterval до 60 секунд, это не работает в фоновом режиме. – alien12

+0

Я тоже сталкиваюсь с тем же вопросом. Вы сделали это и как это работает? – Jacky

ответ

0

Skype делает это, чтобы вы также могли.

Вам необходимо установить UIBackgroundModesaudio в Info.plist, и вам необходимо убедиться, что аудиозапись активна/работает/независимо от того, как вы переключаете приложения (предполагается, что вы не начнете внезапно начать запись/воспроизведение музыки/независимо от того, когда ваше приложение находится в фоновом режиме).

Документы говорят, что «аудио» позволяет воспроизводить аудио в фоновом режиме, но, предположительно, это также относится к записи звука. Если это не сработает, есть несколько вещей, которые вы могли бы попробовать:

  • Установить как «voip», так и «audio».
  • Слушать тишину (это может быть проще всего делать с API очереди аудио).
+0

Я где-то читал, что яблоко будет отклонять приложения, которые устанавливают voip как фоновый режим, но на самом деле не используют voip как часть функциональности основного приложения, я посмотрю на параметр молчания в игре, спасибо. – alien12

+0

На данный момент не используйте voip, потому что вы не являетесь провайдером VoIP –