我正在使用Apple的新Apple Music API制作应用。我有一个带有歌曲列表的屏幕,用户可以点击一个来播放它。我的代码部分有效。被点击的歌曲将播放,但它不会出现在控制中心。控制中心保持空置,好像什么都没有播放一样。
- (void)viewDidLoad {
[super viewDidLoad];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
[[[MPRemoteCommandCenter sharedCommandCenter] playCommand] addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {
NSLog(@"play");
return MPRemoteCommandHandlerStatusSuccess;
}];
[[[MPRemoteCommandCenter sharedCommandCenter] pauseCommand] addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {
NSLog(@"pause");
return MPRemoteCommandHandlerStatusSuccess;
}];
[[[MPRemoteCommandCenter sharedCommandCenter] stopCommand] addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {
return MPRemoteCommandHandlerStatusSuccess;
}];
[[[MPRemoteCommandCenter sharedCommandCenter] togglePlayPauseCommand] addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {
return MPRemoteCommandHandlerStatusSuccess;
}];
[[MPRemoteCommandCenter sharedCommandCenter] playCommand].enabled = YES;
[[MPRemoteCommandCenter sharedCommandCenter] pauseCommand].enabled = YES;
[[MPRemoteCommandCenter sharedCommandCenter] stopCommand].enabled = YES;
[[MPRemoteCommandCenter sharedCommandCenter] togglePlayPauseCommand].enabled = YES;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
[audioSession setActive:YES error:nil];
}
```
点击一个单元格
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
MPMusicPlayerApplicationController *controller = [MPMusicPlayerController applicationQueuePlayer];
[controller performQueueTransaction:^(MPMusicPlayerControllerMutableQueue * _Nonnull queue) {
MPMusicPlayerStoreQueueDescriptor *queueDescripter = [[MPMusicPlayerStoreQueueDescriptor alloc] initWithStoreIDs:@[_album.songs[indexPath.row].identifier]];
[queue insertQueueDescriptor:queueDescripter afterItem:nil];
} completionHandler:^(MPMusicPlayerControllerQueue * _Nonnull queue, NSError * _Nullable error) {
[controller setNowPlayingItem:queue.items[0]];
[controller prepareToPlay];
[controller play];
MPMediaItem *item = [controller nowPlayingItem];
NSDictionary *info = @{MPMediaItemPropertyAlbumTitle:item.albumTitle, MPMediaItemPropertyArtist:album.artistName, MPMediaItemPropertyTitle:item.title, MPMediaItemPropertyArtwork:item.artwork, MPMediaItemPropertyPlaybackDuration:@(item.playbackDuration), MPNowPlayingInfoPropertyElapsedPlaybackTime:@0};
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:info];
}];
}
此外,此消息将记录到控制台。我不确定这是否与这个问题有关。
[RemoteControl] Error setting active player: (null)
答案 0 :(得分:1)
尝试使用Apple's sample code时,只要使用applicationQueuePlayer,我就会观察到相同的行为。使用systemMusicPlayer使代码以您期望的方式工作,更新控制中心。
答案 1 :(得分:1)
这是IMO的错误。
rdar://33923587
编辑好奇:
我可以通过创建我自己的没有混音选项的auddio会话来覆盖Control Center/Lock
屏幕音轨说明(因此它会暂停音频from Apple Music/Music
库),但这不是解决方案。
答案 2 :(得分:0)
MPMusicPlayerApplicationController
代表您与MPRemoteCommandCenter
通信。要查看控件,您需要做的就是设置一个包含多首歌曲的队列。
顺便说一句,在MPMusicPlayerApplicationController
中实例化didSelectRowAtIndexPath:
并不是一个好习惯,因为您每次用户点击一个单元格时都会实例化一个新的MPMusicPlayerApplicationController
。您只需要一个实例,该实例应在viewDidLoad:
中实例化,存储到iVar,然后根据需要进行配置。