使用 Swift 4 更新 IOS 11.2:
现在,如果您使用AVPlayer播放音乐文件,您还应该配置MPNowPlayingInfoCenter.default()
在锁定屏幕上显示正在播放的信息。
下面的代码将在屏幕上显示正在播放的控件,但它无法响应任何命令。
如果您还想控制工作,您应该在这里查看苹果的示例项目:https ://developer.apple.com/library/content/samplecode/MPRemoteCommandSample/Introduction/Intro.html#//apple_ref/doc/uid/TP40017322
Apple 示例代码涵盖了所有内容,但我觉得它令人困惑。
如果您想在锁定屏幕上播放声音并显示控件,这些步骤就可以了。
重要提示:如果您不使用AVPlayer播放声音。如果您使用某些第三方库来生成声音或播放声音文件,您应该阅读代码中的注释。此外,如果您使用的是 ios 模拟器 11.2,您将无法在锁定屏幕上看到任何控件。您应该使用设备来查看它的工作情况。
1- 选择项目-> 功能-> 设置背景模式-> 勾选音频、AirPlay 和画中画

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 所需的背景模式,如下所示:

在我的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;
}
现在即使屏幕被锁定,应用程序也会继续播放音乐 :)