2012-07-18 13 views
8

Uygulamam için (plist'te) arka plan sesini düzgün şekilde etkinleştirdim. Arka planda SPPlaybackManager kullanılarak (telefon kilitlendiğinde/kapandığında) akım tamamlandıktan sonra sonraki parçanın çalınması çalışmaz.Arka plandaki ses kosalibspotify ile

Geçerli parça bittiğinde ve ses durduğunda, uygulama, telefon kilidi açılıncaya kadar sonraki parçayı çalmaya başlamaz ve uygulamam tekrar etkinleşir.

Bunu nasıl düzeltirim? İşte bir sonraki parçayı çalmaya başlamak için kullanıyorum kod snippet. Mevcut parçanın sıfır olduğunu ve sonra bir sonraki parçayı çalmaya başladığını gözlemliyorum. Günlük, oynatma yöneticisi nesnesinde bir sonraki geçerli parçanın ayarlandığını gösterir, ancak alas sessizdir.

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 



    if([keyPath isEqualToString:@"spotifyPlaybackManager.currentTrack"]){ 

     NSLog(@"%@ %@",keyPath,self.spotifyPlaybackManager.currentTrack); 

     if(self.spotifyPlaybackManager.currentTrack==nil && self.mode == PlayerModeSpotify){ 

      NSLog(@"PLAY NEXT"); 
      [self.spotifyPlaybackManager playTrack:self.nextSPTrack callback:^(NSError *error){ 
       if(error) TKLog(@"Spotify Playback Error %@",error); 
      }]; 
     } 
     [[NSNotificationCenter defaultCenter] postNotificationName:PlayerNowPlayingItemDidChange object:self]; 
     return; 
    } 



    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
} 

Konsolu:

spotifyPlaybackManager.currentTrack (null) 
PLAY NEXT 
spotifyPlaybackManager.currentTrack <SPTrack: 0x60f8390>: Karaoke 

cevap

-2

CocoaLibSpotify bir parçayı çalmaya başlamak için bir sürü iş yapar ve büyük olasılıkla sürecinde yeni iç konuları üretmeyecek. Bunun arka planın ses stiline izin verdiğinden şüphe duyuyorum. Bu nedenle, şarkıları değiştirmek için geçici bir arka plan görevi başlatmanız gerekecektir.

+0

'self.spotifyPlaybackManager playTrack: ...' ifadesini çağırmadan hemen önce 'beginBackgroundTaskWithExpirationHandler' komutunu kullanmaya çalıştım ve kod yeni bir görev oluşturulmaya çalışılır başlatılmaz çalışmaya devam etmeyi durdurdu. Başka önerileriniz var mı? – devinross

+0

Ses uygulamam (GroovePond), yeni istemcileri kabul etme ve mevcut istemcilerin durumunu güncelleme gibi arka plan seslerini çalarken çok fazla arka plan görevi yerine getiriyor ve Apple'ın bununla ilgili herhangi bir sorunu yok gibi görünüyor. Bence görevler doğrudan ses çalma ile ilgili olduğu için izin verilir. – Dermot

8

Çözüm çok basittir, ancak bunu gerçekleştirmek bir yılımı aldı. Eski çözümüm, bir önceki parçanın sona ermesinden hemen önce bir arka plan görevi başlatmaktı ve bir sonraki parça çalınana kadar onu çalıştırmaya devam etmekti. Bu çok hata eğilimli oldu. Bunun yerine: Yürütme durumunuzu takip edin (oynatma veya duraklatılmış). Çalmaya geçiş yaptığınızda, bir arka plan görevi başlatın. Duraklatılmış'a geçiş yapmadığınız sürece asla durdurmayın. Durumu parçaların arasında bile Oynat olarak tutun. Info.plist'inizde ses arka planı moduna sahip olduğunuz ve sesin çaldığı sürece, arka plan göreviniz sonsuz bir zaman aşımına sahip olacaktır.

Bazı sözde kodu:

@interface PlayController 
@property BOOL playing; 

- (void)playPlaylist:(SPPlaylist*)playlist startingAtRow:(int)row; 
@end 

@implementation PlayController 
- (void)setPlaying:(BOOL)playing 
{ 
    if(playing == _playing) return; 
    _playing = playing; 

    UIApplication *app = [UIApplication sharedApplication]; 
    if(playing) 
     self.playbackBackgroundTask = [app beginBackgroundTaskWithExpirationHandler:^ { 
      NSLog(@"Still playing music but background task expired! :("); 
        [app endBackgroundTask:self.playbackBackgroundTask]; 
       self.playbackBackgroundTask = UIBackgroundTaskInvalid; 
      }]; 
    else if(!playing && self.playbackBackgroundTask != UIBackgroundTaskInvalid) 
     [app endBackgroundTask:self.playbackBackgroundTask]; 
} 
... 
@end 

Düzenleme: Oh, ve finally blogged about it.

+0

Bir çekicilik gibi çalıştım. Sen gerçek bir kurtarıcısın! – Nailer

+0

Ah, çırpın. Sonuçta işe yaramadı. Bu ilk bakışta benim sorunum değildi. – Nailer

+0

Nevzat için teşekkürler. Ancak "backBackgroundTask:", henüz başlattığımız arka plan görevini durdurmuyor, bu nedenle uygulama başka bir kodu tekrar çalıştıramaz mı? 'endBackgroundTask çağrıldıktan sonra: 'uygulama, setPlaying:' tekrar – Andrei

İlgili konular