2

I made MPNowPlayingInfoCenter but it isn't working. Background playing is working but MPNowPlayingCenter doesn't appear. This is how I made it.

import UIKit
import AVFoundation
import MediaPlayer

class AudioPlayViewController: UIViewController, AVAudioPlayerDelegate {
  var player: AVAudioPlayer!
  var updater: CADisplayLink! = nil

  @IBOutlet weak var playButton: UIButton!
  var url_2 = URL(string: "")
  var selectedFileName:String = ""

  override func viewDidLoad() {
    super.viewDidLoad()
    let path = selectedFileName
    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let url = documentsURL.appendingPathComponent(path)
    url_2 = url

    do {
      player = try AVAudioPlayer(contentsOf: url)
      updater = CADisplayLink(target: self, selector: #selector(self.trackAudio))
      updater.preferredFramesPerSecond = 1
      updater.add(to: RunLoop.current, forMode: RunLoop.Mode.common)
      player.prepareToPlay()
      player.delegate = self
    catch {
      print(error)
    }
    let session = AVAudioSession.sharedInstance()
    do{
      try session.setCategory(AVAudioSession.Category.playback)
    }
    catch{
    }
  }

  func play(){
    player.play()
    MPNowPlayingInfoCenter.default().nowPlayingInfo = [
      MPMediaItemPropertyTitle: selectedFileName,
      MPMediaItemPropertyArtist: "Ariana",
      MPMediaItemPropertyLyrics: "test"
      ]
  }
}

I set Background Modes > Audio, Airplay, and Pictures in picture in Targets > Signing&Capabilities.

jonye._.jin
  • 591
  • 1
  • 5
  • 17
  • Does this answer your question? [xcode - MPNowPlayingInfoCenter info is not displayed on iOS 8](https://stackoverflow.com/questions/30083862/xcode-mpnowplayinginfocenter-info-is-not-displayed-on-ios-8) – BB9z Aug 11 '21 at 04:37

2 Answers2

5

I solved it by adding

func setupNowPlayingInfoCenter(){
    UIApplication.shared.beginReceivingRemoteControlEvents()
    MPRemoteCommandCenter.shared().playCommand.addTarget {event in
      self.play()
      return .success
    }
    MPRemoteCommandCenter.shared().pauseCommand.addTarget {event in
      self.pause()
      return .success
    }
    MPRemoteCommandCenter.shared().nextTrackCommand.addTarget {event in
      self.goForward()
      return .success
    }
    MPRemoteCommandCenter.shared().previousTrackCommand.addTarget {event in
      self.goBackward()
      return .success
    }
  }
jonye._.jin
  • 591
  • 1
  • 5
  • 17
  • Super answer !! Is there any documentation that mentions this cause I could not find anything specific about this. – Shawn Frank May 16 '21 at 17:49
1

I found that you need to call UIApplication.shared.beginReceivingRemoteControlEvents() after you've setup the audio session, so the following worked for me:

try? AVAudioSession.sharedInstance().setCategory(.playback)
try? AVAudioSession.sharedInstance().setActive(true)
UIApplication.shared.beginReceivingRemoteControlEvents()
CMash
  • 1,987
  • 22
  • 35