Похоже, что единственный возможный способ иметь элементы управления на экране блокировки - это начать воспроизведение реального аудиофайла из вашего приложения. Я выполнил обход очень короткого беззвучного воспроизведения файлов при запуске приложения, и теперь у меня есть доступ к этим элементам управления.
Помните, что фоновый режим (аудио) должен быть включен, чтобы видеть элементы управления, пока ваше приложение не на экране.
Другое ограничение заключается в том, что регулятор громкости жестко привязан к громкости устройства, поэтому вы не можете изменять громкость приложения отдельно.
Вот минимальный код для включения элементов управления:
import MediaPlayer
import AVFoundation
class RemoteCommandHandler: NSObject {
static let shared = RemoteCommandHandler()
private var player: AVPlayer!
private var playerItem: AVPlayerItem!
private let audioSession = AVAudioSession.sharedInstance()
private let commandCenter = MPRemoteCommandCenter.shared()
func initRemote() {
let sound = Bundle.main.path(forResource: "SilenceAAC", ofType: "m4a")
playerItem = AVPlayerItem(url: URL(fileURLWithPath: sound!))
player = AVPlayer(playerItem: playerItem)
do {
if #available(iOS 10.0, *) {
try audioSession.setCategory(.playback, mode: .default, options: [])
} else {
// Fallback on earlier versions
try audioSession.setCategory(.playback)
}
try audioSession.setActive(true)
NSLog("AVSession is active - \(audioSession)")
} catch {
NSLog("\(error)")
}
setupNowPlaying()
setupRemoteTransportControls()
player.play()
}
func setupRemoteTransportControls() {
commandCenter.togglePlayPauseCommand.addTarget(self, action: #selector(controlPlayPause))
}
func setupNowPlaying() {
var nowPlayingInfo = [String : Any]()
nowPlayingInfo[MPMediaItemPropertyTitle] = NowPlayingInfo.getValue(.Title)
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}
}