使用Apple Music API播放歌曲不会更新控制中心或锁定屏幕

时间:2017-06-20 02:18:15

标签: ios objective-c iphone apple-music

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

3 个答案:

答案 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,然后根据需要进行配置。