Как заставить мой AVPlayer играть, пока приложение находится в фоновом режиме?
Я сделал домашнее задание... начиталась тут, документы, погугли, stackoverflowing... но все равно не повезло в том, чтобы сделать мой звук палкой, когда пользователь делает приложение в фоновом режиме.
что я сделал до сих пор: Добавлены 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];
но как только пользователь нажимает кнопку "домой", мой звук умирает.
Я также нашел это, но не добавил все же cuase некоторые вещи, которые я читал, говорит, что это не нужно;
newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
if (newTaskId != UIBackgroundTaskInvalid && bgTaskId != UIBackgroundTaskInvalid)
[[UIApplication sharedApplication] endBackgroundTask: bgTaskId];
bgTaskId = newTaskId;
прямо сейчас я понятия не имею, куда я должен пойти, чтобы мой AVPlayer позволил радио петь, пока пользователь делает другие вещи по телефону. Я пробовал на iPhone 4 с 4.2. Дом его на 4.0.
У кого-нибудь есть предложения, что мне делать?
6 ответов
имел ту же проблему, но нашел решение для этого..
смотрите сюда:https://devforums.apple.com/message/395049#395049
содержание приведенной выше ссылке:
заменить APPNAME
С вашим собственным именем приложение!
Im на iOS 4.2.1
EDIT: работа с iOS5 + 6 + 7 beta до сих пор
добавить 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];
создайте свой проект и посмотрите, есть ли какая-либо ошибка, если нет, попробуйте отладить на устройстве симулятора, он может ошибиться тренажер.
надеюсь, это поможет другим с той же проблемой..
обновление IOS 11.2 с помощью Swift 4:
если вы используете "Плеерав" для воспроизведения музыкальных файлов, вы должны также настроить MPNowPlayingInfoCenter.default()
чтобы показать теперь воспроизводимую информацию на экране блокировки.
ниже кода будет отображаться теперь игра управления на экране, но он не сможет отвечать на какие-либо команды.
если вы также хотите, чтобы элементы управления работали, вы должны проверить пример проекта apple здесь: https://developer.apple.com/library/content/samplecode/MPRemoteCommandSample/Introduction/Intro.html#//apple_ref/doc/uid/TP40017322
пример кода Apple охватывает все, но я нахожу его запутанным.
если вы хотите воспроизвести звук и показать элементы управления на экране блокировки, эти шаги будут делать все в порядке.
ВАЖНОЕ ПРИМЕЧАНИЕ: если вы не используя "Плеерав" для воспроизведения звука. Если вы используете третью сторону библиотеки для генерации звука или воспроизведения звукового файла вы должны прочитать комментарии внутри кода. Кроме того, если вы используете iOS simulator 11.2, вы не сможете увидеть какие-либо элементы управления на экране блокировки. Вы должны использовать устройство, чтобы увидеть его работу.
1-Выберите проект - > capabilites - > установить фоновые режимы на - > ТИК аудио, AirPlay и изображение в картинке
2- AppDelegate.Свифт!--7--> файл должен выглядеть так :
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.Свифт!--7--> должен выглядеть так:
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:
я добавляю информацию о своем приложении.файл plist необходимые фоновые режимы как ниже:
и в моем AppDelegate.h я добавляю это импорт:
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
тогда в моем AppDelegate.м я писал применение didFinishLaunchingWithOptionsthis точно, как показано ниже:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
return YES;
}
теперь приложение продолжает играть музыку, даже если экран заблокирован:)
Я успешно сделал аудио работать в фоновом режиме, добавив следующее в мой 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];
iOS 9 Swift
все, что вам нужно, это добавить следующее к вашему didFinishLaunchingWithOptions
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch {
//TODO
}
у вас есть хороший пример фонового приложения GPS, которое воспроизводит звуки, даже когда в фоновом режиме:
http://www.informit.com/articles/article.aspx?p=1646438&seqNum=5
в этом примере используется AudioToolbox.
Я сам сделал тест, и он работает : создайте простой проект, который контролирует сообщение GPS (UIBackgroundModes
location
), и каждый X получил позицию, играть звук с помощью
AudioServicesPlaySystemSound(soundId);
тогда, если вы положили audio
как часть UIBackgroundModes
и звуки будут воспроизводиться, даже если приложение не на переднем плане.
Я сделал такой тест, и он работает нормально !
(мне не удалось заставить его работать с "плеере АВ", так что я fallbacked в AudioToolbox)
У меня такая же проблема, и я нашел решение в документах Apple:https://developer.apple.com/library/ios/qa/qa1668/_index.html
Q: Как я могу гарантировать, что мой носитель будет продолжать играть при использовании AV Foundation, пока мое приложение находится в фоновом режиме?
A: вы должны объявить, что ваше приложение воспроизводит звуковой контент в фоновом режиме, и назначить соответствующую категорию для вашей аудиосессии. См. также Special вопросы для видео СМИ.