Фоновые службы «разрешено продолжать работу в фоновом режиме».Тогда почему я не могу заставить это работать? - PullRequest
0 голосов
/ 22 декабря 2011

Мое приложение соответствует требованиям для использования UIBackgroundModes, установленного в «Приложение воспроизводит звук».Мое приложение воспроизводит музыку из класса MPMusicPlayerController iPodMusicPlayer.То, что я пытаюсь сделать, это позволить пользователю установить таймер для остановки музыки.У меня проблема с этим.Я реализовал фоновую задачу в методе applicationDidEnterBackground следующим образом:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    UIDevice* device = [UIDevice currentDevice];
    BOOL backgroundSupported = NO;
    if ([device respondsToSelector:@selector(isMultitaskingSupported)]) {
        backgroundSupported = device.multitaskingSupported;
    }

    if (backgroundSupported) {
        UIApplication*    app = [UIApplication sharedApplication];
        bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
            dispatch_async(dispatch_get_main_queue(), ^{
                if (bgTask != UIBackgroundTaskInvalid) {
                    [app endBackgroundTask:bgTask];
                }
            });
        }];

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_async(dispatch_get_main_queue(), ^{
                if (bgTask != UIBackgroundTaskInvalid) {
                    if (rootController.sleepTimer != nil)
                    self.sustainTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self  selector:@selector(checkTimeRemaining) userInfo:nil repeats:YES];    
                }

            });
        });
    }
}

с помощью метода checkTimeRemaining:

-(void)checkTimeRemaining{
    NSTimeInterval totalSeconds = rootController.timerSetInSeconds.doubleValue;
    NSTimeInterval elapsedTime = [[NSDate date] timeIntervalSinceDate:rootController.startDateforSleepTimer];
    NSTimeInterval remainingTime = totalSeconds - elapsedTime;
    NSLog(@"remaining time %f",remainingTime);
    if (remainingTime <= 0) {
        [self.musicPlayer pause];
        [sustainTimer invalidate];
        self.sustainTimer = nil;
    }
}

Я не получаю никаких ошибок, нотаймер не выходит за допустимые 10 минут.Так как я играю аудио (вместе с установленным фоновым режимом), я смогу остановить музыку в указанное время.Любые идеи о том, где я иду не так?

Спасибо

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Поскольку beginBackgroundTaskWithExpirationHandler позволяет вам выполнять только задачу конечной длины, ваш таймер все еще ограничен 10-минутным пределом времени, установленным Apple.С другой стороны, аудиосистема позволяет устройству воспроизводить аудио в фоновом режиме до тех пор, пока пользователь не остановит его или звук не прекратится.

Воспроизведение фонового звука

Когда ключ UIBackgroundModes содержит значение аудио, мультимедийные каркасы системы автоматически предотвращают приостановку работы соответствующего приложения при его перемещении в фоновый режим.Пока он воспроизводит аудио или видео контент, приложение продолжает работать в фоновом режиме.Однако если приложение перестает воспроизводить аудио или видео, система приостанавливает его.

0 голосов
/ 22 декабря 2011

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

Но если вы поместите запись времени в обратный вызов буфера Audio Queue или AudioIO Unit, он будет продолжать вызываться какпока звук продолжает воспроизводиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...