MPNowPlayingInfoCenter defaultCenter无法更新或检索信息。

28

我正在更新MPNowPlayingInfoCenter,遇到了一些问题。我已经尝试了很多方法,但是现在感到困惑。以下是我的代码:

    self.audioPlayer.allowsAirPlay = NO;

    Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter");

    if (playingInfoCenter) {

        NSMutableDictionary *songInfo = [[NSMutableDictionary alloc] init];

        MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage:[UIImage imageNamed:@"series_placeholder"]];

        [songInfo setObject:thePodcast.title forKey:MPMediaItemPropertyTitle];
        [songInfo setObject:thePodcast.author forKey:MPMediaItemPropertyArtist];
        [songInfo setObject:@"NCC" forKey:MPMediaItemPropertyAlbumTitle];
        [songInfo setObject:albumArt forKey:MPMediaItemPropertyArtwork];

        [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songInfo];


    }

这个方法不起作用,我也尝试过:

   [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:nil];

我试图让它从iPod应用程序(或可能在那里有信息的任何应用程序)中删除现有信息。此外,只是为了查找问题,我已经尝试在应用程序启动时检索当前信息:

  NSDictionary *info = [[MPNowPlayingInfoCenter defaultCenter] nowPlayingInfo];
  NSString *title = [info valueForKey:MPMediaItemPropertyTitle];
  NSString *author = [info valueForKey:MPMediaItemPropertyArtist];

  NSLog(@"Currently playing: %@ // %@", title, author);

我得到了Currently playing: (null) // (null)的结果。

我已经做了很多研究,以下几篇文章对此进行了详细的解释,但是我仍然无法使其正常工作。我是否漏掉了什么?是否有任何干扰因素?这是我的应用程序需要注册才能访问的服务吗(在任何文档中都没有看到)?

苹果文档

更改锁屏背景音频控件的文本

现在播放信息被忽略了


1
当此代码执行时,媒体是否正在播放? - Ravin
我已经尝试过使用音频播放(通过MPMoviePlayer)和不使用它,结果相同。 - Jayson Lane
使用nslog打印[MPNowPlayingInfoCenter defaultCenter]。文档中说:默认的正在播放信息中心保存了指定为接收远程控制事件的应用程序的正在播放信息。您是否在某个远程设备上播放媒体?请确保媒体正在某个远程设备上播放。因为文档说:远程控制事件允许用户通过系统传输控件或外部配件控制应用程序多媒体。 - Ravin
当我打印MPNowPlayingInfoCenter时,我得到:<MPNowPlayingInfoCenter:0x2857c0> - Jayson Lane
我并不是在玩远程设备或附件... 我的理解是,你可以通过在设备上播放音频来更新此信息(显示在锁屏上),但它也可以用于远程设备... - Jayson Lane
2个回答

55

我最终解决了问题,原来是没有提示我的应用程序接收远程控制事件,加上这一行代码就解决了问题:

 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

我遇到了类似的问题。尽管我实现了上述所有方法,但我仍然无法接收控制事件。https://dev59.com/i6Hia4cB1Zd3GeqPYL21 - A_G
此外,请确保在设置音频会话之后调用 UIApplication.shared.beginReceivingRemoteControlEvents()。以下代码适用于我:try? AVAudioSession.sharedInstance().setCategory(.playback) try? AVAudioSession.sharedInstance().setActive(true) UIApplication.shared.beginReceivingRemoteControlEvents() - CMash

2

我使用以下代码,它总是有效的。 我也像你一样使用MPMoviePlayer。 你是否检查过NSClassFromString(@"MPNowPlayingInfoCenter")是否实际返回YES? 你是否在plist中设置了应用程序在后台播放音频的键值?

- (void) loadMPInformation
{
    NSDictionary *mpInfo;

    if([savedTrack.belongingAlbum.hasAlbumArt boolValue] == NO){
        mpInfo = [NSDictionary dictionaryWithObjectsAndKeys:savedTrack.belongingAlbum.album, MPMediaItemPropertyAlbumTitle, 
                  savedTrack.belongingArtist.artist, MPMediaItemPropertyArtist, savedTrack.name, MPMediaItemPropertyTitle, nil];   
    } else {
        UIImage *artImage = [UIImage imageWithData:savedTrack.belongingAlbum.art];
        MPMediaItemArtwork *artwork = [[MPMediaItemArtwork alloc] initWithImage:artImage];
        mpInfo = [NSDictionary dictionaryWithObjectsAndKeys:savedTrack.belongingAlbum.album, MPMediaItemPropertyAlbumTitle, 
                  savedTrack.belongingArtist.artist, MPMediaItemPropertyArtist, savedTrack.name, MPMediaItemPropertyTitle, artwork, MPMediaItemPropertyArtwork, nil];
    }
    [MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = mpInfo;

}

是的,我已经检查过它返回YES了,我还在plist中设置了应用程序播放音频。 - Jayson Lane
3
等一下,你是在设备上还是模拟器上尝试过?因为我注意到在模拟器上从来都不起作用。 - deleterOfWorlds
我只是在设备上尝试它...您需要注册才能从播放/暂停按钮接收通知吗? - Jayson Lane
我做过。但我不记得这是必要的——尝试一下也是好事。此外,我记得 MPNowPlayingInfoCenter 对你发送的字符串非常挑剔,一定要测试一下。 - deleterOfWorlds
我能说的是注册以接收通知 - 在您的平台上可能需要。否则,我不知道,代码应该可以工作。这是 iPhone 吗? - deleterOfWorlds
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接