2016-06-29 3 views
3

Я пытаюсь добавить события дистанционного управления в приложение для музыкального плеера, но не могу заставить его работать.iOS MediaPlayer События удаленного управления не работают

Некоторые факты:

  • Я использую [MPMusicPlayerController applicationMusicPlayer];
  • Я добавил Audio, AirPlay и Picture в режимах Picture фона;
  • Пример: воспроизведение аудио;
  • Он не получает удаленные уведомления с экрана блокировки и центра управления;

Я сделал пример проекта, который можно скачать здесь: example project Основной источник:

#import "ViewController.h" 
#import <MediaPlayer/MPMediaPickerController.h> 
#import <MediaPlayer/MPMediaQuery.h> 
#import <MediaPlayer/MediaPlayer.h> 

@interface ViewController() 

@property (strong, nonatomic) MPMusicPlayerController *MusicPlayer; 
@property (strong, nonatomic) MPMediaItemCollection *MusicPlayerSongs; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    _MusicPlayerSongs = [MPMediaItemCollection alloc]; 
    _MusicPlayer = [MPMusicPlayerController applicationMusicPlayer]; 
    [_MusicPlayer setShuffleMode: MPMusicShuffleModeOff]; 
    [_MusicPlayer setRepeatMode: MPMusicRepeatModeNone]; 
    [_MusicPlayer beginGeneratingPlaybackNotifications]; 
} 

-(void)viewDidAppear:(BOOL)animated{ 

    [super viewDidAppear:animated]; 

    NSMutableArray *selectedTracks = [NSMutableArray new]; 

    //Find all tracks that contains an 'a' 
    MPMediaPropertyPredicate *songPredicate = 
    [MPMediaPropertyPredicate predicateWithValue:@"a" 
            forProperty:MPMediaItemPropertyTitle 
            comparisonType:MPMediaPredicateComparisonContains]; 

    MPMediaQuery *mediaQuery = [[MPMediaQuery alloc] init]; 
    [mediaQuery addFilterPredicate:songPredicate]; 
    [selectedTracks addObjectsFromArray:[mediaQuery items]]; 

    NSLog(@"Number of tracks containing an 'a': %lu",(unsigned long)selectedTracks.count); 

    self.MusicPlayerSongs = [[MPMediaItemCollection alloc]initWithItems:selectedTracks]; 

    [self.MusicPlayer setQueueWithItemCollection:self.MusicPlayerSongs]; 
    [self.MusicPlayer play]; 
    [self.MusicPlayer beginGeneratingPlaybackNotifications]; 

    [self basicSetup]; 
    [self updateNowPlayingCenter]; 
} 

- (void)basicSetup { 

    //Listen to remote control events 
    [MPRemoteCommandCenter sharedCommandCenter].previousTrackCommand.enabled = NO; 
    [MPRemoteCommandCenter sharedCommandCenter].nextTrackCommand.enabled = NO; 
    [MPRemoteCommandCenter sharedCommandCenter].playCommand.enabled = YES; 
    [MPRemoteCommandCenter sharedCommandCenter].pauseCommand.enabled = YES; 
    [MPRemoteCommandCenter sharedCommandCenter].togglePlayPauseCommand.enabled = YES; 
    [[MPRemoteCommandCenter sharedCommandCenter].nextTrackCommand addTarget:self action:@selector(remoteNext)]; 
    [[MPRemoteCommandCenter sharedCommandCenter].previousTrackCommand addTarget:self action:@selector(remotePrevious)]; 
    [[MPRemoteCommandCenter sharedCommandCenter].playCommand addTarget:self action:@selector(remotePlay)]; 
    [[MPRemoteCommandCenter sharedCommandCenter].pauseCommand addTarget:self action:@selector(remotePlay)]; 
    [[MPRemoteCommandCenter sharedCommandCenter].togglePlayPauseCommand addTarget:self action:@selector(remoteTogglePlayState)]; 

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

} 

-(void)remotePlay{ 
    NSLog(@"remotePlay"); 
    [self.MusicPlayer play]; 
} 

-(void)remoteNext{ 
    NSLog(@"remoteNext"); 
    [self.MusicPlayer skipToNextItem]; 
    [self updateNowPlayingCenter]; 
} 

-(void)remotePrevious{ 
    NSLog(@"remotePrevious"); 
    [self.MusicPlayer skipToPreviousItem]; 
    [self updateNowPlayingCenter]; 
} 

-(void)remotePause{ 
    NSLog(@"remotePause"); 
    [self.MusicPlayer pause]; 
} 

-(void)remoteTogglePlayState{ 
    NSLog(@"remoteTogglePlayState"); 
    if([self.MusicPlayer playbackState] == MPMusicPlaybackStatePlaying){ 
     [self.MusicPlayer pause]; 
    }else{ 
     [self.MusicPlayer play]; 
    } 
} 

-(void)updateNowPlayingCenter{ 

    MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter]; 
    NSMutableDictionary *songInfo = [NSMutableDictionary dictionaryWithDictionary:@{ 
                        MPMediaItemPropertyArtist: [self.MusicPlayer nowPlayingItem].artist, 
                        MPMediaItemPropertyTitle: [self.MusicPlayer nowPlayingItem].title, 
                        MPMediaItemPropertyAlbumTitle: [self.MusicPlayer nowPlayingItem].albumTitle, 
                        }]; 
    center.nowPlayingInfo = songInfo; 
} 

Я просто не могу понять, почему он не работает :(

PROGRESS UPDATE'S Что я узнал до сих пор, если я перезагружу свой iPhone, он работает, но каждый раз после этого этого не произойдет.

Экран блокировки и центр управления показывают правильную дорожку, но не могут управлять приложением.

+0

Вы когда-нибудь заставляли это работать? Я сдался в прошлом году или около того. Я надеюсь, что кто-то это понял. Если вы этого не поняли, я бы тоже хотел это знать. Благодарю. – JeffB6688

ответ

-1

Не уверен, что это вам вообще поможет, но вот как я получил какие-либо изменения (в Swift).

override func viewDidLoad() { 
    super.viewDidLoad() 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.getNowPlayingItem), name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification, object: nil) 
    player.beginGeneratingPlaybackNotifications() 
} 

deinit { 
    player.endGeneratingPlaybackNotifications() 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

Необходимо (addObserver и beginGeneratingPlaybackNotifications), но и (removeObserver и endGeneratingPlaybackNotification). Я еще не знаком с событиями дистанционного управления, но вы также можете попытаться прекратить эти уведомления. Надеюсь это поможет!

Смежные вопросы