iPhone. Проигрывание аудио в фоновом режиме

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

    Для этого нам потребуются пара нехитрых манипуляций.
    Во-первых, нужно сообщить нашему приложению, о том, что оно должно проигрывать музыку даже после нажатия на «HOME»
    Делается это в файле Info.plist проекта:

    Выбираем файл в Project Navigator
    image

    Щёлкаем правой кнопкой мыши по свободному месту и выбираем «Add row»
    image

    В поле «Key» введём «Required background modes»,
    image

    это создаст нам массив, в качестве значения для первого элемента мы добавим «App plays audio».
    image

    Всё, наша программа знает что в фоновом режиме она не должна засыпать полностью, а должна продолжать играть музыку.
    Другой, быстрый способ сделать тоже самое это открыть Info.plist обычным редактором(по сути это просто XML-файл) и дописать
    <key>UIBackgroundModes</key>
    	<array>
    		<string>audio</string>
    	</array>
    


    Теперь инициализируем наш плеер.
    Вообще в iOS SDK есть несколько различных классов для работы со звуком. Я сначала использовал AVQueuePlayer, потом решил отдать предпочтение AVPlayer как самому, на мой взгляд, гибкому.
    В любом случае AVFoundation вам в помощь, для работы с аудио.

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Convert the file path to a URL.
        NSString *urlAddress = @"http://www.example.com/stream";
        //Create a URL object.
        NSURL *urlStream = [NSURL URLWithString:urlAddress];  
    
        AVPlayer *player = [[AVPlayer alloc] initWithURL:urlStream];    
        //Starts playback
        [player play];
    }
    


    А теперь создаём сессию:
        // очень важная строчка, она должна быть ПОСЛЕ инициализации плеера.
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    


    Вот в принципе и всё, плеер умеет и будет работать в фоновом режиме. Вы можете свернуть программу нажатием на «Home» и музыка не прекратится.

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

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 34

      +3
      Во-первых, нужно сообщить нашей аппликации

      Простите, чему?
        0
        А как лучше будет?
        Спасибо.
          +7
          Приложение или программа.

          Аппликация — это поделка из бумаги.
            0
            Хорошо, понял.
            –1
            Апп?
              0
              Сокращённый вариант от «аппликация». Но да, наверное понятнее будет, спасибо.
                0
                Как-то с самого начала, как начал заниматься iOS, мне «привили» слово «апп», хотя сам понимаю что правильнее «приложение»
                  0
                  Угу, будем привыкать.
                    0
                    Правильнее же конечно приложение, но неужели кто-то подумал на поделку из бумаги в данном контексте?
                      0
                      в OS X и iOS приложения – это папки (пакеты) с расширением .app
                        +1
                        Небольшое замечание: для Mac OS X это не обязательное условие, на томах HFS+ нужно лишь наличие установленного бита пакета и специального info.xml
                          0
                          Даже если создать пустую папку и назвать (или позже переименовать) в *.app, то сразу получим пакет приложения (конечно, нерабочий):
                          image
              0
              ​Так можно скачать, проверить ваше приложение?

              Как по мне, пример хорошего приложения для радио — jazzradio.com (личного интереса нет)
              1. показывает наполнения буфера
              2. выбор битрейта
              3. корректно понимает пульт — пауза, плей, переход на селд./пред. станцию.
                0
                Нет, приложение пока не готово.
                Я хотел описать конкретный момент с которым я столкнулся во время разработки. Возможно, если мои тараканы самооценки не уползут далеко, опишу процесс добавления рекламных баннеров с которым сейчас разбираюсь, а потом уже и аппликация будет.
                0
                А как в свзаимодействием с этой штукой — image
                  0
                  Отличный вопрос. Я на самом деле только сегодня узнал о этой штуке. Любое приложение должно уметь использовать эти контролы или они сугубо для iPod?
                    +2
                    Мне кажется, любое, которое проигрывает музыку в фоне. Например «ВКонтакте», когда проигрывает музыку — в этой менюшке показывается его значок. Play/Pause работает только. И с Safari таже ситуация.
                    +5
                    Для взаимодействия с этой штукой есть пара методов beginReceivingRemoteControlEvents/endReceivingRemoteControlEvents у UIApplication.
                      0
                      Спасибо! Полезная ремарка.
                      +1
                      В Media Player Framework есть набор классов. Управление воспроизведением, медиа библиотекой, плейлисты, нотификации. Доступна на всех iOS девайсах.
                      Я использовал только MPMusicPlayerController: «Use an MPMusicPlayerController object, or music player, to play media items from the device iPod library». Правда, не для управлением встроенным плеером, а для программного управления громкостью, это единственный не хак метод.
                        0
                        Да, я его тоже для громкости использую.
                      –2
                      брр, от obj-C бросает в дрожь от его сложности. Тот случай, когда и хочется, и колется :(
                        +2
                        Он не сложный, у него синтаксис странный и непривычный. Если есть опыт С и хорошее понимание ООП, то привыкнуть к синтаксису и разобраться занимает пару недель, а у кого-то даже меньше.
                          0
                          Угу. Я ради этого даже простенький макмини купил, а всё равно не могу по-человечески на этом писать.
                            0
                            Как по мне — так язык не тяжелый.
                              –3
                              Да, уж, согласен. А люди еще Perl ругают за «мусор», а тут-то сколько скобочек, собачек, снежинок :)
                                +1
                                ну, для меня самым сложным было привыкнуть к синтаксису сообщений и всяких там [[[NSString alloc] initWitData:blabla encoding:NSUTF8StringEncoding] autorelease];
                                а в остальном действительно просто С с «наворотами».
                                  0
                                  Когда-то не мог понять, как передать более одного аргумента :)
                                    0
                                    я их вначале вообще неименованными передавал))
                              0
                              Там при создании AVPlayer'а будет meomry leak. Надо сделать переменную player полем класса и релизить ее в dealloc'е.
                                0
                                На самом деле да, хотя в следующем Xcode этим будет заниматься ARC и освобождать объекты самому будет не нужно. А тут согласен, недоглядел, спасибо за замечание. :)
                                0
                                Отличная статья! Помогла
                                  0
                                  абсолютно согласна!
                                  0
                                  отличная статья.
                                  Короткий и рабочий пример. спасибо автору.

                                  Возник вопрос по звуку:
                                  можно ли указать, что нужно проиграть звукой файл, например через 10 минут или в какой-то момент времени? И чтобы это в бекграунде работало.
                                  (по большому счету, то что делает стандартный будильник и таймер)
                                  спасибо

                                  Only users with full accounts can post comments. Log in, please.