xcode - iOS 8 上未显示 MPNowPlayingInfoCenter 信息
xcode - MPNowPlayingInfoCenter info is not displayed on iOS 8
我正在开发一个音乐应用程序,它应该在后台播放音乐。
我用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];
}
但是锁定屏幕上什么也没有显示。它也不会显示在 ControlCenter 中。
我该如何解决我的问题?我在互联网上没有找到任何东西。
在此先感谢 Fabian。
问题是您不满足成为锁屏和控制中心的主人的要求,如I explain in my book。您应该看到现代的 (iOS 8) 等效于此:
您没有看到它的事实表明您忽略了我列出的一个或多个要求(直接从我的书中引用):
- 您的应用程序必须在其响应者链中包含一个 UIResponder
returns 来自
canBecomeFirstResponder
的是,并且该响应者必须
实际上是第一响应者。
- 响应链中的一些 UIResponder,
在第一响应者或以上,必须实施
remoteControlReceivedWithEvent:
。
- 您的应用必须调用 UIApplication
实例方法
beginReceivingRemoteControlEvents
.
- 您应用的音频
会话的策略必须是回放。
- 您的应用程序一定会发出一些声音。
我不知道你遗漏了哪些;它可能不止一个。您可能想将您的代码与工作示例进行比较,此处:
想要扩展@matt 的答案 - 使用 AVAudioSessionCategoryOptionMixWithOthers
选项时设置 nowPlayingInfo 是无用的。
进一步扩展 @matt 的回答,要求您在应用程序返回前台时调用 endReceivingRemoteControlEvents
和 resignFirstResponder
(applicationDidBecomeActive
)。否则,OS 会假定您是一个坏演员(或忘记关闭它们)并完全关闭您显示睡眠控件的能力,即使您再次调用 beginReceivingRemoteControlEvents
也是如此。我添加了这些调用,现在睡眠控件总是在它们应该显示的时候显示。
想解释一下@zakhej 的回答——设置 AVAudioSessionCategoryOptionMixWithOthers 时会发生什么。
- MPNowPlayingInfoCenter是单例的,也就是说只能一个应用设置。
- AVAudioSession与其他应用共享,每个应用都可以设置。
所以。当你设置category AVAudioSessionCategoryAmbient, AVAudioSessionCategoryPlayAndRecord 和其他混合,AVAudioSessionCategoryPlayback 和其他混合时,设置MPNowPlayingInfoCenter 的nowPlayingInfo 是没用的。
我正在开发一个音乐应用程序,它应该在后台播放音乐。
我用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];
}
但是锁定屏幕上什么也没有显示。它也不会显示在 ControlCenter 中。
我该如何解决我的问题?我在互联网上没有找到任何东西。
在此先感谢 Fabian。
问题是您不满足成为锁屏和控制中心的主人的要求,如I explain in my book。您应该看到现代的 (iOS 8) 等效于此:
您没有看到它的事实表明您忽略了我列出的一个或多个要求(直接从我的书中引用):
- 您的应用程序必须在其响应者链中包含一个 UIResponder
returns 来自
canBecomeFirstResponder
的是,并且该响应者必须 实际上是第一响应者。 - 响应链中的一些 UIResponder,
在第一响应者或以上,必须实施
remoteControlReceivedWithEvent:
。 - 您的应用必须调用 UIApplication
实例方法
beginReceivingRemoteControlEvents
. - 您应用的音频 会话的策略必须是回放。
- 您的应用程序一定会发出一些声音。
我不知道你遗漏了哪些;它可能不止一个。您可能想将您的代码与工作示例进行比较,此处:
想要扩展@matt 的答案 - 使用 AVAudioSessionCategoryOptionMixWithOthers
选项时设置 nowPlayingInfo 是无用的。
进一步扩展 @matt 的回答,要求您在应用程序返回前台时调用 endReceivingRemoteControlEvents
和 resignFirstResponder
(applicationDidBecomeActive
)。否则,OS 会假定您是一个坏演员(或忘记关闭它们)并完全关闭您显示睡眠控件的能力,即使您再次调用 beginReceivingRemoteControlEvents
也是如此。我添加了这些调用,现在睡眠控件总是在它们应该显示的时候显示。
想解释一下@zakhej 的回答——设置 AVAudioSessionCategoryOptionMixWithOthers 时会发生什么。
- MPNowPlayingInfoCenter是单例的,也就是说只能一个应用设置。
- AVAudioSession与其他应用共享,每个应用都可以设置。
所以。当你设置category AVAudioSessionCategoryAmbient, AVAudioSessionCategoryPlayAndRecord 和其他混合,AVAudioSessionCategoryPlayback 和其他混合时,设置MPNowPlayingInfoCenter 的nowPlayingInfo 是没用的。