I am not able to get any output in console using NotificationCenter in swift iOS

124 Views Asked by At

I am new to Swift Programing Languge and I'm trying to get a output when the song changes. Code has no any error.

Below is my code

import UIKit

import MediaPlayer

class ViewController: UIViewController {

var trackChangedObserver : AnyObject?
override func viewDidLoad() {
    super.viewDidLoad()
    trackChangedObserver = NotificationCenter.default
        .addObserver(forName: .MPMusicPlayerControllerNowPlayingItemDidChange,
                     object: nil, queue: OperationQueue.main) { (notification) -> Void in
                        self.updateTrackInformation()
    }

}
deinit {
    NotificationCenter.default.removeObserver(trackChangedObserver!)
}

 func updateTrackInformation() {
    let musicPlayer = MPMusicPlayerController.systemMusicPlayer
    musicPlayer.beginGeneratingPlaybackNotifications()

    let currentTrack: MPMediaItem? = musicPlayer.nowPlayingItem
    let title = currentTrack?.value(forProperty: MPMediaItemPropertyTitle)
        as? String ?? "None"
    print(title)
    let artist = currentTrack?.value(forProperty: MPMediaItemPropertyArtist)
        as? String ?? "None"
    print(artist)
    let album = currentTrack?.value(forProperty: MPMediaItemPropertyAlbumTitle)
        as? String ?? "None"
    print(album)

}

}

2

There are 2 best solutions below

0
Anil Kumar On

you can do like this:

let nc = NotificationCenter.default

nc.post(name: .MPMusicPlayerControllerNowPlayingItemDidChange, object: nil)

To register to catch a notification being posted, use this:

nc.addObserver(self, selector: #selector(updateTrackInformation()), name: .MPMusicPlayerControllerNowPlayingItemDidChange, object: nil)

    @objc func updateTrackInformation(notification: NSNotification) {
    let musicPlayer = MPMusicPlayerController.systemMusicPlayer
    musicPlayer.beginGeneratingPlaybackNotifications()

    let currentTrack: MPMediaItem? = musicPlayer.nowPlayingItem
    let title = currentTrack?.value(forProperty: MPMediaItemPropertyTitle)
        as? String ?? "None"
    print(title)
    let artist = currentTrack?.value(forProperty: MPMediaItemPropertyArtist)
        as? String ?? "None"
    print(artist)
    let album = currentTrack?.value(forProperty: MPMediaItemPropertyAlbumTitle)
        as? String ?? "None"
    print(album)

}
0
Mikhail On

First of all, you should call this in viewDidLoad or earlier, or notifications will not be sent:

let musicPlayer = MPMusicPlayerController.systemMusicPlayer
musicPlayer.beginGeneratingPlaybackNotifications()

Second issue is related to memory management (retain cycle):

trackChangedObserver = NotificationCenter.default
    .addObserver(forName: .MPMusicPlayerControllerNowPlayingItemDidChange,
                 object: nil, queue: OperationQueue.main) { [weak self] notification  -> Void in
                    self.updateTrackInformation() //!!!!!
}

You are capturing here self as strong reference. And NotificationCenter will keep it forever so your ViewController will never be destroyed and deinit method will not be called. To fix add [weak self] to the closure (as I did above).