Используйте элементы управления плеером на экране блокировки iOS для приложения дистанционного управления - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь реализовать управление плеером на экране блокировки iOS для моего приложения Remote Control, которое управляет проигрывателем Musi c на P C. Поэтому в основном мне нужно управлять воспроизведением вне устройства iOS. Я включил фоновые режимы в возможностях (аудио) и попытался установить элементы управления экрана блокировки MPRemoteCommandCenter, но они не отображаются. Вот код:

class RemoteCommandHandler: NSObject {
    static let shared = RemoteCommandHandler()

    private let player = AVPlayer()
    private let audioSession = AVAudioSession.sharedInstance()
    private let commandCenter = MPRemoteCommandCenter.shared()

    func initRemote() {
        //UIApplication.shared.beginReceivingRemoteControlEvents()

        do {
            if #available(iOS 10.0, *) {
                try audioSession.setCategory(.playback, mode: .default, options: [])
            } else {
                // Fallback on earlier versions
                try audioSession.setCategory(.playback)
            }
        } catch {
            NSLog("\(error)")
        }

        do {
            try audioSession.setActive(true)
            NSLog("AVSession is active")
        } catch {
            NSLog("\(error)")
        }

        setupRemoteTransportControls()
        setupNowPlaying()
    }

    func setupRemoteTransportControls() {
        commandCenter.togglePlayPauseCommand.isEnabled = true
        commandCenter.togglePlayPauseCommand.addTarget(self, action: #selector(controlPlayPause))
    }

    func setupNowPlaying() {
        var nowPlayingInfo = [String : Any]()
        nowPlayingInfo[MPMediaItemPropertyTitle] = NowPlayingInfo.getValue(.Title)

        if let image = UIImage(named: "DemoArtwork") {
            nowPlayingInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(image: image)
        }
        nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = TimeInterval(exactly: 10)
        nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = NowPlayingInfo.getDurationMs() / 1000
        nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 1.0

        MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
    }
}

Можно ли вообще делать то, что я хочу? Что я делаю не так?

1 Ответ

0 голосов
/ 11 марта 2020

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

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

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

Вот минимальный код для включения элементов управления:

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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...