ios - 检测原生iOS Music App中当前正在播放的歌曲信息

标签 ios objective-c ios7

我在本地 iOS 音乐应用程序中获取当前正在播放的歌曲信息(如(标题、艺术家...))时遇到了一些问题。

这是确切的问题,我的应用程序正在使用 MPMusicPlayerControlleriPodMusicPlayer这个属性是调用 myPlayer .当用户在我的应用程序中控制音乐时,我能够以这种方式显示当前的歌曲播放信息......

- (void)getTrackDescription {

    // getting whats currently playing
    self.nowPlayingItem = [myPlayer nowPlayingItem];

    // song title currently playing
    self.title = [self.nowPlayingItem valueForProperty:MPMediaItemPropertyTitle];

    // if title is not fund Unknown will be displayed
    if (title == (id)[NSNull null] || title.length == 0) {
        title = @"Unknown";
    }

    // artist currently playing
    self.artist = [self.nowPlayingItem valueForProperty:MPMediaItemPropertyArtist];

    // if artist is not fund Unknown will be displayed
    if (artist == (id)[NSNull null] || artist.length == 0) {
        artist = @"Unknown";
    }

    //[self.currentlyPlaying setLineBreakMode:NSLineBreakByWordWrapping];

    // displaying current artist and title song playing
    [self.currentlyPlaying setText:[NSString stringWithFormat:@"%@ - %@", artist, title]];
}

但是,当用户将应用程序留在后台或仅使用 时,就会出现问题。控制中心更改歌曲.. 如果用户继续使用控制中心或音乐应用程序本身,我的应用程序仍会显示以前的歌曲信息并且没有任何更新。

我试图以这种方式解决问题......
- (void)viewDidLoad {
    [super viewDidLoad];

    if (self.myPlayer.playbackState == MPMusicPlaybackStatePlaying || self.myPlayer.playbackState == MPMusicPlaybackStateSeekingForward || self.myPlayer.playbackState == MPMusicPlaybackStateSeekingBackward){
        // updating track name regardless the user uses app controllers or not
        [self getTrackDescription];
    } 
}

我什至尝试评论 if 条件以查看我是否以这种方式获取歌曲信息,但这是同样的问题。

好吧,我希望有人可以帮助我并解释我做错了什么..

提前致谢...!

更新

这就是我目前所拥有的...我的 getTrackDescription 逻辑是相同的,但签名更改为 - (void)getTrackDescription:(id)notification
- (void)viewWillAppear:(BOOL)animated{

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];

    [notificationCenter addObserver:self
                           selector:@selector(getTrackDescription:)
                               name:MPMusicPlayerControllerPlaybackStateDidChangeNotification
                             object:self.myPlayer];
    [self.myPlayer beginGeneratingPlaybackNotifications];

}

-(void)viewWillDisappear:(BOOL)animated{

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                               name:MPMusicPlayerControllerPlaybackStateDidChangeNotification
                                               object:self.myPlayer];
    [self.myPlayer endGeneratingPlaybackNotifications];
}

最佳答案

您要做的是将您的 View Controller 作为观察者添加到 MPMusicPlayerControllerNowPlayingItemDidChangeNotification每次音乐播放器中的轨道更改时都会调用通知,这听起来很重要。不要忘记使用以下方法指定播放器何时开始/结束生成这些通知。

[[MPMusicPlayerController iPodMusicPlayer] beginGeneratingPlaybackNotifications];
[[MPMusicPlayerController iPodMusicPlayer] endGeneratingPlaybackNotifications];

关于ios - 检测原生iOS Music App中当前正在播放的歌曲信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24253264/

相关文章:

uitableview - 有没有办法让 iOS 7 中的 UITableView 单元格在分隔符中没有换行符?

ios - 失败时隐藏 iAdBanner 并尝试显示我自己的按钮时出错 Xcode iOS7

xcode - AVSpeechSynthesizer - 如何检测毫秒暂停的点(iPHONE - iPAD/iOS7 xcode)

android - 用户向上滚动时无法单击 SliverPersistentHeader 上的操作按钮

ios - 我的游戏 View Controller UIButtons 有 IBOutlets,需要更好地组织

iphone - 如何从子类正确设置父类(super class)属性

iphone - 如何使用SFHFKeyChainUtils?

ios - TableViewController 委托(delegate)没有被调用

ios - 键盘在 IOS 7 中不退出

javascript - 我希望我的程序检测用户何时通过 uiwebview (iphone) 单击网站上的提交按钮