Apple Music conflicting with MPNowPlayingInfoCenter
Asked Answered
A

0

8

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?

Antivenin answered 11/4, 2017 at 17:19 Comment(1)
Hi Marcelo, did you finally get around to this? More than a year later I'm still struggling with this very same issue: being able to get notifications on apple music playback in the background :(Gallup

© 2022 - 2024 — McMap. All rights reserved.