2

我正在使用 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)

4

3 回答 3

1

尝试使用Apple 的示例代码,只要使用 applicationQueuePlayer,我就会观察到相同的行为。使用 systemMusicPlayer 使代码以您期望的方式工作,更新控制中心。

于 2017-07-01T20:07:06.247 回答
1

这是国际海事组织的一个错误。

rdar://33923587

编辑好奇:

Center/Lock我可以通过创建自己的不带混音选项的音频会话来覆盖控制屏幕轨道描述(因此它暂停了音频from Apple Music/Music库),但这不是解决方案。

于 2017-08-17T08:37:14.203 回答
1

代表您MPMusicPlayerApplicationController进行通信。MPRemoteCommandCenter为了查看控件,您需要做的就是设置一个包含多首歌曲的队列。

顺便说一句,实例化MPMusicPlayerApplicationController不是didSelectRowAtIndexPath:一个好习惯,因为MPMusicPlayerApplicationController每次用户点击单元格时都会实例化一个新的。您只需要一个应该在 中实例化viewDidLoad:、存储到 iVar 并根据需要进行配置的实例。

于 2018-11-02T21:34:38.093 回答