beginReceivingRemoteControlEvents不触发Apple Music的事件
我从我的应用程序播放苹果音乐,苹果音乐播放器的代码是 –
-(void) submitAppleMusicTrackWithProductID: (NSString *) productID // productID in US is the last numbers after i= in the share URL from Apple Music { [SKCloudServiceController requestAuthorization:^(SKCloudServiceAuthorizationStatus status) { NSLog(@"status is %ld", (long)status); SKCloudServiceController *cloudServiceController; cloudServiceController = [[SKCloudServiceController alloc] init]; [cloudServiceController requestCapabilitiesWithCompletionHandler:^(SKCloudServiceCapability capabilities, NSError * _Nullable error) { NSLog(@"%lu %@", (unsigned long)capabilities, error); if (capabilities >= SKCloudServiceCapabilityAddToCloudMusicLibrary || capabilities==SKCloudServiceCapabilityMusicCatalogPlayback) { NSLog(@"You CAN add to iCloud!"); [[MPMediaLibrary defaultMediaLibrary] addItemWithProductID:productID completionHandler:^(NSArray<__kindof MPMediaEntity *> * _Nonnull entities, NSError * _Nullable error) { NSLog(@"added id%@ entities: %@ and error is %@", productID, entities, error); NSArray *tracksToPlay = [NSArray arrayWithObject:productID]; [[MPMusicPlayerController applicationMusicPlayer] setQueueWithStoreIDs:tracksToPlay]; [[MPMusicPlayerController applicationMusicPlayer] stop]; [[MPMusicPlayerController applicationMusicPlayer] play]; self.isTrackChangedByNextPreviousButton = NO; [[NSNotificationCenter defaultCenter]removeObserver:self name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:nil]; [[NSNotificationCenter defaultCenter]removeObserver:self name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleTrackChanged:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handlePlaybackStateChanged:) name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:nil]; [[MPMusicPlayerController applicationMusicPlayer] beginGeneratingPlaybackNotifications]; [[MPMusicPlayerController applicationMusicPlayer] setRepeatMode: MPMusicRepeatModeNone]; }]; } else { NSLog(@"Blast! The ability to add Apple Music track is not there. sigh."); } }]; }]; } -(void)handleTrackChanged:(id )notification { if (!self.AppleMusicPreviuosTrack) { self.AppleMusicPreviuosTrack = [[Tracks alloc] init]; } if (self.AppleMusicPreviuosTrack.trackId == self.CurrentTrack.trackId && [MPMusicPlayerController applicationMusicPlayer].currentPlaybackRate == 0 && !self.isSongChangedManually) { self.isSongChangedManually = YES; [self FilterArtistsTracks:@"next" :^(Tracks *track, NSError *err) { }]; } else { if ([[MPMusicPlayerController applicationMusicPlayer] currentPlaybackRate]==1) { self.AppleMusicPreviuosTrack.trackId = self.CurrentTrack.trackId; [[NSNotificationCenter defaultCenter] postNotificationName:kTrackChanged object:nil]; //Delay execution of my block for 20 seconds. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 30 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ self.isSongChangedManually = NO; }); } } } -(void)handlePlaybackStateChanged:(id )notification { NSLog(@"handle_PlaybackStateChanged"); [[NSNotificationCenter defaultCenter] postNotificationName:kDidTrackPlaybackStatus object:nil]; if ([MPMusicPlayerController applicationMusicPlayer].currentPlaybackRate>0) { [self.playerMenuView.playpauseButton setImage:[UIImage imageNamed:@"pause"] forState:UIControlStateNormal]; } else { [self.playerMenuView.playpauseButton setImage:[UIImage imageNamed:@"play"] forState:UIControlStateNormal]; } }
这是伟大的工作。 现在我想从locking屏幕控制轨道,为此,我在viewWillAppear
了以下代码
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [APP_DELEGATE becomeFirstResponder];
而remoteControlReceivedWithEvent
方法是写在AppDelegate
文件中的,如下所示 –
-(void)remoteControlReceivedWithEvent:(UIEvent *)event { switch (event.subtype) { case UIEventSubtypeRemoteControlTogglePlayPause: [APP_DELEGATE PlayPauseMusic:nil]; //[streamer pause]; break; case UIEventSubtypeRemoteControlPlay: [APP_DELEGATE PlayPauseMusic:nil]; //[streamer start]; break; case UIEventSubtypeRemoteControlPause: [APP_DELEGATE PlayPauseMusic:nil]; //[streamer pause]; break; case UIEventSubtypeRemoteControlStop: [APP_DELEGATE PlayPauseMusic:nil]; //[streamer stop]; break; case UIEventSubtypeRemoteControlNextTrack: [APP_DELEGATE next:nil]; break; case UIEventSubtypeRemoteControlPreviousTrack: [APP_DELEGATE previous:nil]; break; default: break; } }
注 –如果AVPlayer
正在播放iTunes
曲目,或者Spotify iOS SDK正在播放Spotify
曲目,则每次remoteControlReceivedWithEvent
触发remoteControlReceivedWithEvent
。
但是,在播放Apple音乐曲目时,相同的代码不会触发 –
[MPMusicPlayerController applicationMusicPlayer] or [MPMusicPlayerController systemMusicPlayer]
任何帮助将不胜感激。 谢谢
而不是使用-(void)remoteControlReceivedWithEvent:(UIEvent *)event
来跟踪控件,使用MPRemoteCommandCenter
添加目标到每个控件:
注意:在分配目标之前启用控件很重要。
[MPRemoteCommandCenter sharedCommandCenter].playCommand.enabled = YES; [[MPRemoteCommandCenter sharedCommandCenter].playCommand addTarget:self action:@selector(remotePlay)]; [MPRemoteCommandCenter sharedCommandCenter].pauseCommand.enabled = YES; [[MPRemoteCommandCenter sharedCommandCenter].pauseCommand addTarget:self action:@selector(remoteStop)]; [MPRemoteCommandCenter sharedCommandCenter].previousTrackCommand.enabled = YES; [[MPRemoteCommandCenter sharedCommandCenter].previousTrackCommand addTarget:self action:@selector(loadPreviousSong)]; [MPRemoteCommandCenter sharedCommandCenter].nextTrackCommand.enabled = YES; [[MPRemoteCommandCenter sharedCommandCenter].nextTrackCommand addTarget:self action:@selector(loadNextSong)];
select:
-(void) remotePlay { [APP_DELEGATE PlayPauseMusic:nil]; } -(void) remoteStop { [APP_DELEGATE PlayPauseMusic:nil]; } -(void) loadNextSong { [APP_DELEGATE next:nil]; } -(void) loadPreviousSong { [APP_DELEGATE previous:nil]; }