ios 当应用程序在后台时,如何让我的 AVPlayer 播放?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4771105/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I get my AVPlayer to play while app is in background?
提问by swe_mattias
I've done my homework... been reading here, the docs, googling, stackoverflowing... but still no luck in making my sound stick when the user makes the app go into the background.
我已经完成了我的功课......一直在这里阅读,文档,谷歌搜索,stackoverflowing......但是当用户让应用程序进入后台时,仍然没有运气让我的声音保持稳定。
What I have done so far: Added the UIBackgroundModes, audio to the plist-file.
到目前为止我所做的:将 UIBackgroundModes、音频添加到 plist 文件。
First this code:
首先这段代码:
radioAudio = [[AVAudioSession alloc] init];
[radioAudio setCategory:AVAudioSessionCategoryPlayback error:nil];
[radioAudio setActive:YES error:nil];
Then this:
然后这个:
NSString *radioURL = @"http://xxx.xxx.xxx/radio.m3u";
radioPlayer = [[AVPlayer playerWithURL:[NSURL URLWithString:radioURL]] retain];
But as soon as the user hits the home-button, my sound dies.
但是一旦用户按下主页按钮,我的声音就会消失。
I also found this, but not added yet cuase some stuff I've read says it is not needed;
我也发现了这个,但还没有添加,因为我读过的一些东西说不需要;
newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
if (newTaskId != UIBackgroundTaskInvalid && bgTaskId != UIBackgroundTaskInvalid)
[[UIApplication sharedApplication] endBackgroundTask: bgTaskId];
bgTaskId = newTaskId;
Right now I have no idea where I should go to make my AVPlayer let the radio sing while the user does other stuff on the phone. I am testing this on an iPhone 4 with 4.2. Building it for 4.0.
现在我不知道我应该去哪里让我的 AVPlayer 让收音机唱歌,而用户在手机上做其他事情。我正在 4.2 的 iPhone 4 上对此进行测试。为 4.0 构建它。
Anyone have any suggestions what I should do?
有人对我应该做什么有任何建议吗?
回答by EFE
UPDATE IOS 11.2 with Swift 4:
使用 Swift 4 更新 IOS 11.2:
Now if you are using AVPlayerto play music files you should also configure MPNowPlayingInfoCenter.default()
to show now playing info on the lock screen.
现在,如果您使用AVPlayer播放音乐文件,您还应该配置MPNowPlayingInfoCenter.default()
为在锁定屏幕上显示正在播放的信息。
Below code will show now playing controls on the screen but it won't be able to respond any commands.
下面的代码将在屏幕上显示正在播放的控件,但它将无法响应任何命令。
If you also want to controls to work you should check apple's sample project here: https://developer.apple.com/library/content/samplecode/MPRemoteCommandSample/Introduction/Intro.html#//apple_ref/doc/uid/TP40017322
如果你还想控制工作,你应该在这里检查苹果的示例项目:https: //developer.apple.com/library/content/samplecode/MPRemoteCommandSample/Introduction/Intro.html#//apple_ref/doc/uid/TP40017322
Apple sample code covers all but i find it confusing.
Apple 示例代码涵盖了所有内容,但我觉得它令人困惑。
If you want to play sound and show controls on the lock screen these steps will do just fine.
如果您想在锁定屏幕上播放声音和显示控件,这些步骤就可以了。
IMPORTANT NOTE:If you are NOTusing AVPlayerto play sound. If you are using some third party libraries to generate sound or playback a sound file you should read comments inside the code. Also if you are using ios simulator 11.2 you won't be able to see any controls on lock screen. You should use a device to see it work.
重要提示:如果您不使用AVPlayer播放声音。如果您使用某些第三方库来生成声音或播放声音文件,您应该阅读代码中的注释。此外,如果您使用的是 ios 模拟器 11.2,您将无法在锁定屏幕上看到任何控件。您应该使用设备来查看它的工作情况。
1- Select project -> capabilites -> set background modes ON -> tick Audio, AirPlay and Picture in Picture
1- 选择项目 -> 功能 -> 设置背景模式开启 -> 勾选音频、AirPlay 和画中画
2- AppDelegate.swiftfile should look like this :
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.swiftshould look like this:
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()
}
OLD ANSWER IOS 8.2:
旧答案 IOS 8.2:
Patrick's answer is totally right.
帕特里克的回答是完全正确的。
But i'm gonna write what i do for ios 8.2:
但我要写我为ios 8.2所做的事情:
I add my app's info.plist required background modes like below:
我添加了我的应用程序的 info.plist 所需的后台模式,如下所示:
And in my AppDelegate.hi add these imports:
在我的AppDelegate.h 中,我添加了这些导入:
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
Then in my AppDelegate.mi wrote application didFinishLaunchingWithOptionsthisexactly like below:
然后在我的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;
}
Now App keeps playing music even if screen is locked :)
现在即使屏幕被锁定,应用程序也会继续播放音乐:)
回答by Patrick R
Had the same problem, but found a solution for this..
有同样的问题,但找到了解决方案..
Look here: https://devforums.apple.com/message/395049#395049
看这里:https: //devforums.apple.com/message/395049#395049
The content of the above link:
以上链接内容:
Replace APPNAME
with your own app name!
替换APPNAME
为您自己的应用程序名称!
Im on iOS 4.2.1
我在 iOS 4.2.1
EDIT: Working with iOS5 + 6 + 7 beta so far
编辑:工作与iOS5的+ 6 + 7测试版至今
Add UIBackgroundModes
in the APPNAME-Info.plist
, with the selection App plays audio
添加UIBackgroundModes
在APPNAME-Info.plist
, 选择 App 播放音频
Then add the AudioToolBox
framework to the folder frameworks.
然后将AudioToolBox
框架添加到文件夹框架中。
In the APPNAMEAppDelegate.h
add:
在APPNAMEAppDelegate.h
添加:
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
so it look like this:
所以它看起来像这样:
...
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
...
In the APPNAMEAppDelegate.m
add the following:
在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);
into the
进入
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
but before the two lines:
但在两行之前:
[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];
Build your project and see if theres any error, If not, try debug on Device insted of the Simulator, it CAN bug on simulator.
构建您的项目并查看是否有任何错误,如果没有,请尝试在模拟器的设备上进行调试,它可以在模拟器上出现错误。
Hope this helps others with same problem..
希望这可以帮助其他有同样问题的人..
回答by atomoil
I have successfully made audio run in the background by adding the following to my applicationDidFinishLaunching
通过将以下内容添加到我的 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];
回答by Marcio Arantes
iOS 9 Swift
iOS 9 斯威夫特
All you should need is add the following to your didFinishLaunchingWithOptions
您只需要将以下内容添加到您的 didFinishLaunchingWithOptions
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch {
//TODO
}
回答by yonel
You have a good example of a GPS background app that plays sounds even when in background :
您有一个很好的 GPS 后台应用程序示例,即使在后台也能播放声音:
http://www.informit.com/articles/article.aspx?p=1646438&seqNum=5
http://www.informit.com/articles/article.aspx?p=1646438&seqNum=5
In this example, AudioToolbox is used.
在本例中,使用了 AudioToolbox。
I did a test myself and it works : create a simple project that monitors the GPS post (UIBackgroundModes
location
) , and every x received position, play a sound using
我自己做了一个测试,它的工作原理:创建一个简单的项目来监控 GPS 柱 ( UIBackgroundModes
location
) 和每个 x 接收到的位置,使用播放声音
AudioServicesPlaySystemSound(soundId);
AudioServicesPlaySystemSound(soundId);
Then if you put audio
as part of your UIBackgroundModes
and the sounds will be played, even if the application isn't in foreground anymore.
然后,如果你把它audio
作为你的一部分UIBackgroundModes
,即使应用程序不再处于前台,声音也会被播放。
I've made such a test and it works ok !
我已经做了这样的测试,它工作正常!
(I didn't manage to get it working with AVPlayer so I fallbacked to AudioToolbox)
(我没有设法让它与 AVPlayer 一起工作,所以我退回到 AudioToolbox)
回答by Andriy Savran
I've the same problem and I found solution in Apple Docs:https://developer.apple.com/library/ios/qa/qa1668/_index.html
我遇到了同样的问题,我在 Apple Docs 中找到了解决方案:https: //developer.apple.com/library/ios/qa/qa1668/_index.html
Q: How do I ensure my media will continue playing when using AV Foundation while my application is in the background?
A: You must declare your app plays audible content while in the background, and assign an appropriate category to your audio session. See also Special Considerations for Video Media.
问:当我的应用程序在后台时,我如何确保在使用 AV Foundation 时我的媒体可以继续播放?