xcode - iOS 8上不显示MPNowPlayingInfoCenter信息

时间:2015-05-06 17:39:18

标签: ios xcode mpmovieplayercontroller lockscreen audio-player

我正在开发一个应该在后台播放音乐的音乐应用程序。

我使用MPMoviePlayerController播放音乐。我的代码用于启动MPMoviePlayerController

NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
resourcePath = [resourcePath stringByAppendingString:@"/music.m4a"];
NSError* err;
self.player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:resourcePath]];
if (err) {
    NSLog(@"ERROR: %@", err.localizedDescription);
}
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];
[session setActive:YES error:nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self.player setShouldAutoplay:NO];
[self.player setControlStyle: MPMovieControlStyleEmbedded];
self.player.view.hidden = YES;
[self.player prepareToPlay];

当我执行[self.player play];音乐开始时。 但我还想在LockScreen和ControlCenter中显示歌曲名称,专辑名称和专辑插图。我使用以下代码:

Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter");
    if (playingInfoCenter) {
        NSMutableDictionary *songInfo = [[NSMutableDictionary alloc] init];
        MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage: [UIImage imageNamed:@"artwork.png"]];
        [songInfo setObject:@"SongName" forKey:MPMediaItemPropertyTitle];
        [songInfo setObject:@"ArtistName" forKey:MPMediaItemPropertyArtist];
        [songInfo setObject:@"AlbumTitle" forKey:MPMediaItemPropertyAlbumTitle];
        [songInfo setObject:albumArt forKey:MPMediaItemPropertyArtwork];
        [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songInfo];
    }

但LockScreen中没有显示任何内容。它也不会显示在ControlCenter中。

如何解决我的问题?我在互联网上找不到任何东西。

先谢谢Fabian。

4 个答案:

答案 0 :(得分:27)

问题是你不能满足成为锁屏和控制中心主人的要求I explain in my book。你应该看到现代(iOS 8)相当于:

enter image description here

您没有看到它的事实表明您忽略了我列出的一个或多个要求(直接在我的书中引用):

  • 您的应用必须在其响应者链中包含一个UIResponder 从canBecomeFirstResponder返回YES,并且响应者必须 实际上是第一响应者。
  • 响应者链中的一些UIResponder, 在第一响应者或以上,必须实施 remoteControlReceivedWithEvent:
  • 您的应用必须调用UIApplication 实例方法beginReceivingRemoteControlEvents
  • 您应用的音频 会话的政策必须是播放。
  • 您的应用必须发出一些声音。

我不知道你遗漏了哪些;它可能不止一个。您可能希望将代码与工作示例进行比较,在此处:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/iOS7bookExamples/bk2ch14p653backgroundPlayerAndInterrupter/backgroundPlayer/backgroundPlayer/ViewController.m

答案 1 :(得分:8)

想要扩展@ matt的答案 - 当你使用AVAudioSessionCategoryOptionMixWithOthers选项时,设置nowPlayingInfo是没用的。

答案 2 :(得分:0)

在@ matt的回答中进一步扩展,当应用回到前台(endReceivingRemoteControlEvents)时,您需要致电resignFirstResponderapplicationDidBecomeActive。否则操作系统会假定您是一个坏演员(或忘记关闭它们)并关闭您完全显示睡眠控制的能力,即使再次呼叫beginReceivingRemoteControlEvents之后也是如此。我添加了这些调用,现在睡眠控件总是显示它们应该的时间。

答案 3 :(得分:0)

想解释@zakhej的答案-设置AVAudioSessionCategoryOptionMixWithOthers时会发生什么。

  1. MPNowPlayingInfoCenter是单例,这意味着只能有一个应用程序对其进行设置。
  2. AVAudioSession与其他应用共享,每个应用都可以设置。

所以。当您设置类别AVAudioSessionCategoryAmbient,AVAudioSessionCategoryPlayAndRecord并与其他用户混合,AVAudioSessionCategoryPlayback并与其他用户混合时,设置MPNowPlayingInfoCenter的nowPlayingInfo是没有用的。