CADislayLink не запускается, если устройство заблокировано

РЕДАКТИРОВАТЬ: использование CADislayLink для мониторинга AVAudioRecorder счетчиков не является хорошей идеей, если приложение работает в фоновом режиме. Он перестает срабатывать, если устройство спит (в моем случае блокирует устройство). Решением для этого является использование NSTimer. Вот код, который вызывает мою проблему

- (void)startUpdatingMeter {
    // Using `CADisplayLink` here is not a good choice. It stops triggering if lock the device
    self.meterUpdateDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleAudioRecorderMeters)];
    [self.meterUpdateDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}

Решение: вместо этого используйте NSTimer

  // Set timeInterval as frame refresh interval
  self.timerMonitor = [NSTimer timerWithTimeInterval:1.f/60.f target:self selector:@selector(handleAudioRecorderMeters:) userInfo:nil repeats:NO];
  [[NSRunLoop mainRunLoop] addTimer:self.timerMonitor forMode:NSDefaultRunLoopMode];

Приведенный ниже код отлично работает с AVAudioRecorder, независимо от того, используем ли мы AVAudioSessionCategoryRecord или AVAudioSessionCategoryPlayAndRecord.

ОРИГИНАЛЬНЫЙ ВОПРОС: Пока создаю приложение, которое записывает звук, даже в фоновом режиме. Это похоже на iTalk.

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

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

введите здесь описание изображения

Вот мой код для настройки AVAudioSession и AVAudioRecorder

- (void)configurateAudioSession {
    NSError *error = nil;
    // Return success after set category
    BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDuckOthers error:&error];
    // Return success after set active
    success = [[AVAudioSession sharedInstance] setActive:YES error:&error];
    // Return success after set mode
    success = [[AVAudioSession sharedInstance] setMode:AVAudioSessionModeVideoRecording error:&error];
}

- (void)configAudioRecorder {
    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath_ = [searchPaths objectAtIndex:0];
    NSString *pathToSave = [documentPath_ stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];

    // Create audio recorder
    NSURL *url = [NSURL fileURLWithPath:pathToSave];
    NSDictionary *settings = @{ AVSampleRateKey: @44100.0,
                                AVFormatIDKey: @(kAudioFormatAppleLossless),
                                AVNumberOfChannelsKey: @1,
                                AVEncoderAudioQualityKey:@(AVAudioQualityMax), };

    NSError *error = nil;
    self.audioRecorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
    if (error) {
        NSLog(@"Error on create audio: %@", error);
    }
    else {
        [self.audioRecorder prepareToRecord];
        self.audioRecorder.meteringEnabled  = YES;
        [self.audioRecorder record];
    }
}

Буду очень признателен, если вы предоставите мне любую информацию. Спасибо, парень!


person nahung89    schedule 10.09.2015    source источник


Ответы (1)


Вы должны установить категорию своего AVAudioSession вот так

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:&sessionError];

Чтобы он записывал звук, когда устройство заблокировано.

Как сказано в документе

Чтобы продолжить запись звука, когда ваше приложение переходит в фоновый режим (например, когда экран блокируется), добавьте значение звука в ключ UIBackgroundModes в файле списка свойств информации.

Также проверьте эту ссылку

AVAudioRecorder не записывает, когда экран заблокирован

person Rajat    schedule 10.09.2015
comment
Боюсь, что это ничего не меняет. AVAudioSessionCategoryRecord и AVAudioSessionCategoryPlayAndRecord имеют одинаковый результат, как я сказал выше - person nahung89; 10.09.2015
comment
Я не понимаю, почему это не сработает, поскольку в документации говорится, что он будет работать, пока экран заблокирован. - person Rajat; 10.09.2015
comment
Ты прав. Рекордер по-прежнему работает в режиме блокировки устройства. Проблема исходит от CADisplayLink, который я использую для наблюдения за записывающим устройством. Я обновлю свой вопрос. Спасибо большое! - person nahung89; 10.09.2015
comment
Я думаю, будет лучше, если вы разместите новый вопрос, тогда он будет наверху, и большинство пользователей его увидят (просто предложение) - person Rajat; 10.09.2015
comment
Ах, на самом деле я нашел проблему и исправил ее. Поэтому я думаю, что было бы лучше, если бы обновили мой вопрос, а не создавали новый. - person nahung89; 10.09.2015
comment
Без проблем. Действуй, - person Rajat; 10.09.2015