2016-04-25 16 views
7

tôi đang chơi của Apple Âm nhạc từ ứng dụng của tôi, mã máy nghe nhạc apple là như -beginReceivingRemoteControlEvents không kích hoạt các sự kiện cho Apple Âm nhạc

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

} 

mà đang làm việc tuyệt vời. Bây giờ tôi muốn kiểm soát theo dõi từ màn hình khóa, cho điều này tôi đã sau mã trong viewWillAppear

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

remoteControlReceivedWithEvent phương pháp được viết bằng AppDelegate tập tin như sau -

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

Note - Các remoteControlReceivedWithEvent được kích hoạt mỗi lần nếu iTunes các bản nhạc đang phát theo AVPlayer HOẶC Spotify các bản nhạc đang được Spotify iOS SDK phát.

Nhưng cùng một mã là không kích hoạt trong khi chơi của Apple Âm nhạc các bài hát bằng -

[MPMusicPlayerController applicationMusicPlayer]  

       or 

[MPMusicPlayerController systemMusicPlayer] 

bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn

+0

Cũng cố gắng để con số này ra! – evenodd

Trả lời

0

Thay vì sử dụng -(void)remoteControlReceivedWithEvent:(UIEvent *)event để theo dõi cho các điều khiển, sử dụng MPRemoteCommandCenter mục tiêu làm tăng thêm mỗi một trong số các điều khiển:

Lưu ý: Điều quan trọng là để cho phép các điều khiển trước khi gán một mục tiêu.

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

Selectors:

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

Bạn có các chức năng này được gọi khi sử dụng MPMusicPlayerController? Tôi không thể làm cho nó cháy. – evenodd

+0

Thử kích hoạt ViewController của bạn như là Responder đầu tiên với - (BOOL) canBecomeFirstResponder {return true; } –

+0

Hm đã thử điều đó, nhưng tôi sẽ thử lại. Tôi chỉ muốn chắc chắn rằng bạn thực sự có nó làm việc? – evenodd

Các vấn đề liên quan