Как выключить музыку в фоновом режиме в программе IOS?

Я делаю программу для iOS, чтобы использовать AVAudioPlayer для воспроизведения музыки в фоновом режиме. Но я не знаю, как выключить музыку через определенное время. Я пытаюсь использовать UILocalNotification для остановки музыки в методе:

- (void)application:(UIApplication *)app didReceiveLocalNotification:(UILocalNotification *)notification

Но способ действует только после того, как пользователь получил уведомление и щелкнул, чтобы закрыть!

Как я могу остановить музыку автоматически через определенное время?


person yikyCai    schedule 17.12.2012    source источник


Ответы (2)


Если вы используете AVPlayer вместо AVAudioPlayer, вы можете добиться этого с помощью addBoundaryTimeObserverForTimes:queue:usingBlock:

Я попробовал это с AVQueuePlayer (который является подклассом AVPlayer), и это сработало.

Попробуйте что-то вроде этого:

id observer = [avPlayer addBoundaryTimeObserverForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:CMTimeMake(60, 1)]] queue:NULL usingBlock:^{
        [avPlayer pause];
    }];

И где-то позже:

[avPlayer removeTimeObserver:observer];
person Hjalmar    schedule 17.12.2012
comment
Большое спасибо! Мне кстати нравится! Но может ли AVQueuePlayer играть по циклу? - person yikyCai; 18.12.2012
comment
Я предлагаю зарегистрироваться на AVPlayerItemDidPlayToEndTimeNotification, а затем либо перезапустить песню, либо снова поставить ее в очередь. Но я не делал этого в фоновом режиме, поэтому я не уверен. Пожалуйста, сообщите мне, если вы преуспели или столкнулись с дополнительными проблемами. Удачи! - person Hjalmar; 18.12.2012
comment
Хороший ответ. Гораздо лучше моего! Я бы проголосовал за вас дважды, если бы мог. - person matt; 18.12.2012

Я бы хотел оказаться неправым, но я считаю, что то, о чем вы просите, может оказаться невозможным. У меня сложилось впечатление, что если пользователь на самом деле нажимает кнопку «Домой», чтобы перевести ваше приложение в фоновый режим, оно не может работать как «таймер сна», потому что вы не можете запустить таймер. Собственные приложения Apple могут делать такие вещи, но у них есть особые привилегии.

Например, посмотрите на это приложение:

https://itunes.apple.com/us/app/music-sleep-timer/id320583424?mt=8

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

Возможно, вам лучше посоветовать пользователю прибегнуть к таймеру обратного отсчета в приложении Apple Clock. Он может выключить музыку и перевести устройство в спящий режим.

person matt    schedule 17.12.2012
comment
Спасибо за вашу помощь! Но на самом деле многие приложения уже реализуют эту функцию! Например, itunes.apple.com/cn/app/super-hypnotist/ или itunes.apple.com/cn/app/qq-yin-le/id414603431?l=en&mt=8 поэтому я думаю, что должен быть путь к каждому - person yikyCai; 17.12.2012
comment
Что ж, есть способы добиться того же эффекта обманом. Допустим, у вас есть 30-минутный музыкальный файл. И вы хотите играть только 10 минут. Затем вы можете использовать возможности редактирования iOS для создания нового музыкального файла, состоящего только из первых десяти минут этого файла. Так оно и играет, пользователь ставит вас на задний план, и если файл подходит к концу, музыка останавливается (и ваше приложение приостанавливается, так как оно больше не воспроизводится). - person matt; 17.12.2012
comment
это способ! Но если файл всего 10 минут и я хочу повторить, чтобы воспроизвести его через 30 минут, вот что я путаю! - person yikyCai; 17.12.2012
comment
Опять же, вы можете создать очередь, состоящую из этого файла три раза. - person matt; 17.12.2012
comment
Спасибо! Ваш способ может решить мою проблему, но я думаю, что используйте AVAudioPlayer и запустите [avPlayer addBoundaryTimeObserverForTimes: [NSArray arrayWithObject: [NSValue valueWithCMTime: CMTimeMake (60, 1)]] очередь: NULL usingBlock: ^ { [avPlayer pause];}]; метод более лучше! - person yikyCai; 18.12.2012