Apple Music conflicting with MPNowPlayingInfoCenter

匆匆过客 提交于 2019-12-19 06:16:48

问题


I need some help with an issue when my music player app is playing on background.

I'm able to play the musics in the app and in the background with both services. I'm also able to set the MPNowPlayingInfoCenter and it displays the correct info, but the play/pause, next track and previous tracks are working only when the user is authenticated with Spotify:

  • notifications are received correctly by the app when the user authenticates with Spotify

  • but it doesn't work when user authenticates with Apple Music. In this case it seems that Apple Music is the one receiving the notifications.

I'm using an AVPlayer to play the musics when synced with Apple Music and SPTAudioStreamingController when synced with Spotify.

Here is the code of the Media center setup:

- (void)setMediaCenterinfoForPlayer:(id)player {

    SPTAudioStreamingController *spotifyPlayer;
    AVPlayer *localPlayer;

    NSMutableDictionary *trackInfo = [[NSMutableDictionary alloc] initWithDictionary: @{ MPMediaItemPropertyTitle: self.currentTrack.name,
                                                                                     MPMediaItemPropertyArtist: ((SPTArtist *)self.currentTrack.artists[0]).name,
                                                                                     MPMediaItemPropertyAlbumTitle : self.currentTrack.album.name,
                                                                                     MPNowPlayingInfoPropertyPlaybackRate:  @(1.0)
                                                                                     }];

    if ([player isKindOfClass:[SPTAudioStreamingController class]]) {
    spotifyPlayer = (SPTAudioStreamingController *)player;

        [trackInfo setObject:[NSNumber numberWithFloat:spotifyPlayer.currentPlaybackPosition] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
        [trackInfo setObject:[NSNumber numberWithFloat:spotifyPlayer.currentTrackDuration] forKey:MPMediaItemPropertyPlaybackDuration];

    } else {
        localPlayer = (AVPlayer *)player;

        NSTimeInterval playbackTime = [self currentPlaybackTimeForPlayer:player];

        [trackInfo setObject:@(playbackTime) forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
        [trackInfo setObject:@(CMTimeGetSeconds(localPlayer.currentItem.asset.duration)) forKey:MPMediaItemPropertyPlaybackDuration];
    }

    [MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = trackInfo;

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

    Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter");
    if (playingInfoCenter) {
        [self albumURLCoverForCurrentTrackWithBlock:^(UIImage *albumImage) {
        MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage:albumImage];

            [trackInfo setObject:albumArt forKey:MPMediaItemPropertyArtwork];
            [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:trackInfo];
        }];
    }
}

Here is the code for the event handling:

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
    if (event.type == UIEventTypeRemoteControl) {
        MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
        NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo];
        [playingInfo setObject:[NSNumber numberWithFloat:[AudioPlayerManager sharedInstance].spotifyPlayer.currentPlaybackPosition] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
        center.nowPlayingInfo = playingInfo;

        if (event.subtype == UIEventSubtypeRemoteControlPlay) {
            [[AudioPlayerManager sharedInstance] playTrack];
        } else if (event.subtype == UIEventSubtypeRemoteControlPause) {
            [[AudioPlayerManager sharedInstance] pauseTrack];
        } else if (event.subtype == UIEventSubtypeRemoteControlPreviousTrack) {
            [[AudioPlayerManager sharedInstance] previousTrack];
        } else if (event.subtype == UIEventSubtypeRemoteControlNextTrack) {
            [[AudioPlayerManager sharedInstance] nextTrack];
    }
        [[NSNotificationCenter defaultCenter] postNotificationName:kEventTypeRemoteControlUpdateState object:self];
    }
}

Could anyone please point me a way to tackle this situation?

来源:https://stackoverflow.com/questions/43352423/apple-music-conflicting-with-mpnowplayinginfocenter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!