LockScreen Player не появляется, когда экран заблокирован на реальном устройстве.

Я новичок в Swift, и у меня есть AVPlayer, который отлично воспроизводится на определенном экране. Моя цель - воспроизвести тот же звук в режиме блокировки экрана. Пока это то, что я сделал, и код ниже. почему-то я вообще не вижу виджет плеера на экране блокировки. Что я делаю неправильно здесь.

class MyAudiosViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,AVAudioPlayerDelegate {


@IBAction func playButtonPressed(_ sender: Any) {
        if(currentRowSelected != nil ){
            if AudioPlayer.isPlaying() {
                AudioPlayer.pause()
                playButton.setImage(UIImage(named: "play_button"), for: UIControlState.normal)
            } else {
                AudioPlayer.play()
                playButton.setImage(UIImage(named: "pause_button"), for: UIControlState.normal)
            }

            setUpBackgroundMode()

        }else{
            "Track is not selected from list"
        }

    }

}


 extension MyAudiosViewController {

    override func remoteControlReceived(with event: UIEvent?) {
        if let receivedEvent = event {
            if (receivedEvent.type == .remoteControl) {
                switch receivedEvent.subtype {
                case .remoteControlTogglePlayPause:
                   playButtonPressed(AudioPlayer.isPlaying())
                case .remoteControlPlay:
                playButtonPressed(AudioPlayer.player?.play())
                case .remoteControlPause:
                   playButtonPressed(AudioPlayer.player?.pause())
                case .remoteControlNextTrack:
                     print("next pressed")
                case .remoteControlPreviousTrack:
                     print("previous pressed")
                default:
                    print("received sub type \(receivedEvent.subtype) Ignoring")
                }
            }
        }
    }

    func setUpBackgroundMode() {
        if  let positionSong = AudioPlayer.getPlayingIndex() {
            let song = songDetailsArray[positionSong]
            let songData = song.audioDetails

        MPNowPlayingInfoCenter.default().nowPlayingInfo = [
            MPMediaItemPropertyTitle: songData?.title ?? "",
            MPMediaItemPropertyArtist: songData?.healerName ?? "",
            MPMediaItemPropertyPlaybackDuration: 
            self.player?.currentItem?.asset.duration
        ]
            UIApplication.shared.beginReceivingRemoteControlEvents()

        becomeFirstResponder()
       }
      }
  }

person danu    schedule 13.02.2018    source источник


Ответы (1)


Попробуйте это и проверьте эту демо

объявите эту переменную в вашем playerviewcontroller

var audioSession = AVAudioSession.sharedInstance()

в viewDidiLoad добавьте этот код

    try! self.audioSession.setCategory(AVAudioSessionCategoryPlayback)
    try! self.audioSession.setActive(true)

    UIApplication.shared.beginReceivingRemoteControlEvents()
    self.becomeFirstResponder()

передавать данные в эту функцию или в вашу

var nowPlayingInfoCenter = MPNowPlayingInfoCenter.default()
var remoCommandCenter = MPRemoteCommandCenter.shared()
func updateNowPlayingInfo(trackName:String,artistName:String,img:UIImage) {

    var art = MPMediaItemArtwork(image: img)
    if #available(iOS 10.0, *) {
        art = MPMediaItemArtwork(boundsSize: CGSize(width: 200, height: 200)) { (size) -> UIImage in
            return img
        }
    }

    nowPlayingInfoCenter.nowPlayingInfo = [MPMediaItemPropertyTitle: trackName,
                                           MPMediaItemPropertyArtist: artistName,
                                           MPMediaItemPropertyArtwork : art]

    remoCommandCenter.seekForwardCommand.isEnabled = false
    remoCommandCenter.seekBackwardCommand.isEnabled = false
    remoCommandCenter.previousTrackCommand.isEnabled = false
    remoCommandCenter.nextTrackCommand.isEnabled = false
    remoCommandCenter.togglePlayPauseCommand.isEnabled = false
}

вызовите вышеуказанную функцию, когда вы загружаете новую песню.

  func loadNewSong() {
      //your audio player code.
      updateNowPlayingInfo(trackName:"just Like that", artistName:"LeoJam",img:UIImage(string:"img")!)
  }
person Pratik Prajapati    schedule 13.02.2018
comment
С этой реализацией мне все еще нужно использовать мои расширения, сэр. - person danu; 13.02.2018
comment
если вы хотите использовать свои расширения, просто не вызывайте эту функцию updateNowPlayingInfo , вызовите функцию расширений - person Pratik Prajapati; 13.02.2018
comment
не могли бы вы показать, где я должен использовать updateNowPlayingInfo в контексте моего кода, приведенного выше. bcz с моими текущими расширениями, кажется, не работает - person danu; 13.02.2018
comment
Должен ли я также использовать функцию remoteControlReceived? В противном случае, как бы он перехватил уведомления, когда он переходит в фоновое настроение, чтобы инициировать MPRemoteCommandCenter. Я что-то пропустил, сэр? Я не вижу виджет на экране блокировки. Это все, что я должен сделать - person danu; 13.02.2018
comment
да, вы должны использовать remoteControlReceived func. приведенный выше код предназначен только для отображения текущей информации только на экране блокировки. - person Pratik Prajapati; 13.02.2018