Как заставить мой AVPlayer играть, когда приложение находится в фоновом режиме? - PullRequest
29 голосов
/ 23 января 2011

Я сделал свою домашнюю работу ... читал здесь, документы, поиск в Google, переполнение стека ... но все же не повезло в создании моей звуковой карты, когда пользователь переводит приложение в фоновый режим.

Что я сделал до сих пор: Добавлен UIBackgroundModes, аудио в plist-файл.

Сначала этот код:

radioAudio = [[AVAudioSession alloc] init];
[radioAudio setCategory:AVAudioSessionCategoryPlayback error:nil];
[radioAudio setActive:YES error:nil];

Тогда это:

NSString *radioURL = @"http://xxx.xxx.xxx/radio.m3u";
radioPlayer = [[AVPlayer playerWithURL:[NSURL URLWithString:radioURL]] retain];

Но как только пользователь нажимает кнопку домой, мой звук умирает.

Я тоже нашел это, но еще не добавил, потому что некоторые вещи, которые я прочитал, говорят, что они не нужны;

newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
     if (newTaskId != UIBackgroundTaskInvalid && bgTaskId != UIBackgroundTaskInvalid)
        [[UIApplication sharedApplication] endBackgroundTask: bgTaskId];
bgTaskId = newTaskId;

Сейчас я понятия не имею, куда мне обратиться, чтобы мой AVPlayer позволил радио петь, пока пользователь делает другие вещи на телефоне. Я тестирую это на iPhone 4 с 4.2. Сборка для 4.0.

У кого-нибудь есть предложения, что мне делать?

Ответы [ 6 ]

42 голосов
/ 10 марта 2011

Была такая же проблема, но нашел решение для этого ..

Смотрите здесь: https://devforums.apple.com/message/395049#395049

Содержание вышеуказанной ссылки:


Замените APPNAME собственным именем приложения!

Я на iOS 4.2.1

РЕДАКТИРОВАТЬ: работа с iOS5 + 6 + 7 бета пока

Добавьте UIBackgroundModes в APPNAME-Info.plist, с выбором Приложение воспроизводит аудио

Затем добавьте каркас AudioToolBox в каркасы папок.

ВAPPNAMEAppDelegate.h добавить:

#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>

, чтобы это выглядело так:

...
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
...

В APPNAMEAppDelegate.m добавьте следующее:

// Set AudioSession
NSError *sessionError = nil;
[[AVAudioSession sharedInstance] setDelegate:self];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];

/* Pick any one of them */
// 1. Overriding the output audio route
//UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
//AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);

// 2. Changing the default output audio route
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute);

в

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

, но перед двумя строками:

[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];

Создайте свой проект и посмотрите, есть ли какая-либо ошибка. Если нет, попробуйте отладку на устройстве, установленном в симуляторе, МОЖЕТ ошибка на симуляторе.

Надеюсь, это поможет другим с такой же проблемой ..

40 голосов
/ 19 марта 2015

ОБНОВЛЕНИЕ IOS 11.2 с Swift 4:

Теперь, если вы используете AVPlayer для воспроизведения музыкальных файлов, вы также должны настроить MPNowPlayingInfoCenter.default() для отображения информации о воспроизведении.на экране блокировки.

Приведенный ниже код покажет, что воспроизводятся элементы управления на экране, но он не сможет отвечать на любые команды.

Если вы также хотите, чтобы управляющие элементы работали, вы должны проверить пример проекта Apple здесь: https://developer.apple.com/library/content/samplecode/MPRemoteCommandSample/Introduction/Intro.html#//apple_ref/doc/uid/TP40017322

Пример кода Apple охватывает все, но я нахожу его запутанным.

Если выЧтобы воспроизвести звук и отобразить элементы управления на экране блокировки, эти шаги будут вполне нормальными.

ВАЖНОЕ ПРИМЕЧАНИЕ: Если вы НЕ , используя AVPlayer для воспроизведения звука.Если вы используете сторонние библиотеки для создания звука или воспроизведения звукового файла, вам следует прочитать комментарии внутри кода.Также, если вы используете ios simulator 11.2, вы не сможете увидеть какие-либо элементы управления на экране блокировки.Вы должны использовать устройство, чтобы увидеть, как оно работает.


1- Выберите проект -> Возможности -> Включить режимы фона -> отметьте Audio, AirPlay и Картинка в картинке

ios 11 background audio setting

2- Файл AppDelegate.swift должен выглядеть следующим образом:

import UIKit

import AVFoundation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
{

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
    {
        // Override point for customization after application launch.

        do
        {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

         //!! IMPORTANT !!
         /*
         If you're using 3rd party libraries to play sound or generate sound you should
         set sample rate manually here.
         Otherwise you wont be able to hear any sound when you lock screen
         */
            //try AVAudioSession.sharedInstance().setPreferredSampleRate(4096)
        }
        catch
        {
            print(error)
        }
        // This will enable to show nowplaying controls on lock screen
        application.beginReceivingRemoteControlEvents()

        return true
    }
}

3- ViewController.swift должно выглядеть так:

import UIKit

import AVFoundation
import MediaPlayer

class ViewController: UIViewController
{

    var player : AVPlayer = AVPlayer()

    override func viewDidLoad()
    {
        super.viewDidLoad()


        let path = Bundle.main.path(forResource: "music", ofType: "mp3")
        let url = URL(fileURLWithPath: path!)

        // !! IMPORTANT !!
        /*
            If you are using 3rd party libraries to play sound 
            or generate sound you should always setNowPlayingInfo 
            before you create your player object.

            right:
            self.setNowPlayingInfo()
            let notAVPlayer = SomePlayer()

            wrong(You won't be able to see any controls on lock screen.):
            let notAVPlayer = SomePlayer()
            self.setNowPlayingInfo()
         */

        self.setNowPlayingInfo()
        self.player = AVPlayer(url: url)

    }


    func setNowPlayingInfo()
    {
        let nowPlayingInfoCenter = MPNowPlayingInfoCenter.default()
        var nowPlayingInfo = nowPlayingInfoCenter.nowPlayingInfo ?? [String: Any]()

        let title = "title"
        let album = "album"
        let artworkData = Data()
        let image = UIImage(data: artworkData) ?? UIImage()
        let artwork = MPMediaItemArtwork(boundsSize: image.size, requestHandler: {  (_) -> UIImage in
            return image
        })

        nowPlayingInfo[MPMediaItemPropertyTitle] = title
        nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = album
        nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork

        nowPlayingInfoCenter.nowPlayingInfo = nowPlayingInfo
    }

    @IBAction func startPlayingButtonPressed(_ sender: Any)
    {
        self.player.play()
    }

СТАРЫЙ ОТВЕТ IOS 8.2:

Ответ Патрика совершенно верный.

Но янапишу, что я делаю для ios 8.2 :

Я добавляю info.plist моего приложения необходимые фоновые режимы, как показано ниже:

enter image description here

Ив моем AppDelegate.h я добавляю следующие импорта:

#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>

Затем в моем AppDelegate.m я написал приложение didFinishLaunchingWithOptionsthis точно так же, как показано ниже:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

    return YES;
}

Теперь приложение продолжает воспроизводить музыку, даже если экран заблокирован:)

10 голосов
/ 23 января 2011

Я успешно запустил аудио в фоновом режиме, добавив следующее к своему applicationDidFinishLaunching

// Registers this class as the delegate of the audio session.
[[AVAudioSession sharedInstance] setDelegate: self];    
// Allow the app sound to continue to play when the screen is locked.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
3 голосов
/ 16 декабря 2015

iOS 9 Swift

Все, что вам нужно, это добавить следующее в свой didFinishLaunchingWithOptions

do  {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch {
    //TODO
}
1 голос
/ 18 марта 2011

У вас есть хороший пример фонового приложения GPS, которое воспроизводит звуки даже в фоновом режиме:

http://www.informit.com/articles/article.aspx?p=1646438&seqNum=5

В этом примере используется AudioToolbox.

Я сам проверил тест, и он работает: создайте простой проект, который отслеживает сообщение GPS (UIBackgroundModes location), и при каждом полученном положении x воспроизводите звук, используя

AudioServicesPlaySystemSound(soundId);

Тогда, если вы положите audio как часть вашего UIBackgroundModes, и звуки будут воспроизводиться, даже если приложение больше не находится на переднем плане.

Я сделал такой тест, и он работает нормально!

(мне не удалось заставить его работать с AVPlayer, поэтому я отказался от AudioToolbox)

0 голосов
/ 01 марта 2016

У меня такая же проблема, и я нашел решение в Apple Docs: https://developer.apple.com/library/ios/qa/qa1668/_index.html

В: Как я могу обеспечить, чтобы мои медиафайлы продолжали воспроизводиться при использовании AV Foundation, когда мое приложение работает в фоновом режиме?

A: Вы должны объявить, что ваше приложение воспроизводит слышимый контент в фоновом режиме, и назначить соответствующую категорию для вашего аудио сеанса. См. Также Специальные Соображения для видео носителей .

...