2016-04-25 37 views
7

sto giocando Apple Music dalla mia applicazione, il codice lettore musicale di Apple è così -beginReceivingRemoteControlEvents non eventi di attivazione per 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]; 
    } 

} 

che sta lavorando molto. Ora mi vuole controllare il brano dalla schermata di blocco, per questo ho fatto seguente codice nel viewWillAppear

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
    [APP_DELEGATE becomeFirstResponder]; 

e remoteControlReceivedWithEvent metodo è scritto in AppDelegate file come segue -

-(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; 
    } 
} 

Nota - Il remoteControlReceivedWithEvent attivato ogni volta se i brani iTunes sono riprodotti da AVPlayer OPPURE i brani Spotify sono riprodotti da Spotify iOS SDK.

Ma lo stesso codice non determina durante la riproduzione di brani musicali di Apple da -

[MPMusicPlayerController applicationMusicPlayer]  

       or 

[MPMusicPlayerController systemMusicPlayer] 

qualsiasi aiuto sarà apprezzato. Grazie

+0

cercando anche di capire questo fuori! – evenodd

risposta

0

Invece di usare -(void)remoteControlReceivedWithEvent:(UIEvent *)event per tenere traccia per i controlli, utilizzare MPRemoteCommandCenter aggiunta di obiettivi a ciascuno dei controlli:

Nota: E 'importante per consentire i controlli prima di assegnare un bersaglio.

[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)]; 

selettori:

-(void) remotePlay { 
    [APP_DELEGATE PlayPauseMusic:nil]; 
} 
-(void) remoteStop { 
    [APP_DELEGATE PlayPauseMusic:nil]; 
} 
-(void) loadNextSong { 
    [APP_DELEGATE next:nil]; 
} 
-(void) loadPreviousSong { 
    [APP_DELEGATE previous:nil]; 
} 
+0

Hai chiamato queste funzioni quando usi MPMusicPlayerController? Non riesco a farlo sparare. – evenodd

+0

Prova a abilitare ViewController come First Responder con - (BOOL) canBecomeFirstResponder {return true; } –

+0

L'ho provato, ma ho intenzione di riprovare. Voglio solo assicurarmi che tu abbia effettivamente funzionato? – evenodd