2012-07-18 12 views
8

साथ पृष्ठभूमि ऑडियो मैं ठीक से अपना एप्लिकेशन के लिए पृष्ठभूमि ऑडियो सक्षम किया है (plist में)। वर्तमान के बाद अगला ट्रैक चलाया पृष्ठभूमि (फ़ोन लॉक होने पर/बंद) में SPPlaybackManager का उपयोग कर काम नहीं करता है पूरा हो गया है।cocoalibspotify

जब वर्तमान ट्रैक समाप्त हो जाती है, और ऑडियो बंद हो जाता है, एप्लिकेशन अगले ट्रैक खेलने शुरू नहीं होगी फ़ोन अनलॉक हो और मेरे ऐप फिर से सक्रिय हो जाता है जब तक।

मैं इसे कैसे ठीक करूं? यहां कोड का एक स्निपेट है जिसका उपयोग मैं अगले ट्रैक के खेल को शुरू करने के लिए कर रहा हूं। मैं देखता हूं कि वर्तमान ट्रैक शून्य हो जाता है, और फिर अगला ट्रैक खेलना शुरू कर देता है। लॉग मुझे दिखाता है कि अगला वर्तमान ट्रैक प्लेबैक प्रबंधक ऑब्जेक्ट में सेट किया जा रहा है, लेकिन यह चुप है।

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

कंसोल:

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

उत्तर

-2

CocoaLibSpotify बहुत काम किसी ट्रैक को चलाते शुरू करने के लिए करता है और संभावना प्रक्रिया में नए आंतरिक सूत्र अंडे जाएगा। मुझे संदेह है कि पृष्ठभूमि की ऑडियो शैली में इसकी अनुमति है ताकि आपको ट्रैक बदलने के लिए एक अस्थायी पृष्ठभूमि कार्य शुरू करने की आवश्यकता हो।

+0

मैंने 'self.spotifyPlaybackManager playTrack: ...' को कॉल करने से पहले सीधे 'startBackgroundTaskWithExpirationHandler' डालने का प्रयास किया और जैसे ही एक नया कार्य बनने का प्रयास किया गया है, कोड चल रहा है। कोई अन्य सुझाव? – devinross

+0

मेरा ऑडियो ऐप (ग्रूवपॉन्ड) पृष्ठभूमि ऑडियो चलाते समय बहुत सारे पृष्ठभूमि कार्यों को करता है, जैसे नए क्लाइंट स्वीकार करना और मौजूदा क्लाइंट के राज्य को अपडेट करना, और ऐप्पल को इसके साथ कोई समस्या नहीं है। मुझे लगता है कि क्योंकि काम सीधे ऑडियो के प्लेबैक से संबंधित हैं, इसलिए उन्हें अनुमति है। – Dermot

8

समाधान बहुत आसान है, लेकिन यह मुझे यह महसूस करने के लिए एक साल लग गया। मेरा पुराना समाधान पिछले ट्रैक समाप्त होने से ठीक पहले एक पृष्ठभूमि कार्य शुरू करना था, और अगले ट्रैक को तब तक चलाना जारी रखा जब तक कि अगला ट्रैक नहीं चल रहा था। वह बहुत त्रुटि प्रवण था। इसके बजाय:

अपने खेल राज्य का

रखें ट्रैक (खेल रहे हैं या रोका गया)। जब भी आप प्लेइंग में संक्रमण करते हैं, तो पृष्ठभूमि कार्य शुरू करें। इसे तब तक न रोकें, जब तक कि आप रोके गए नहीं। राज्य को ट्रैक के बीच भी बजाना जारी रखें। जब तक आपके पास आपकी जानकारी में ऑडियो पृष्ठभूमि मोड है। प्लिस्ट और ऑडियो चल रहा है, तो आपके पृष्ठभूमि कार्य में अनंत टाइमआउट होगा।

कुछ छद्म कोड:

@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 

संपादित करें: ओह, और मैं finally blogged about it

+0

एक आकर्षण की तरह काम किया। आप एक सच्चे उद्धारक हैं! – Nailer

+0

आह, स्नैप करें। सब के बाद काम नहीं किया। यह पहली जगह में मेरी समस्या नहीं थी। – Nailer

+0

पोस्ट नेविन के लिए धन्यवाद। लेकिन 'endBackgroundTask करता है:' पृष्ठभूमि कार्य है कि हम बस शुरू कर दिया है बंद करो, इसलिए आवेदन नहीं किसी अन्य कोड फिर से चला सकते हैं? यानी 'एंडबैकग्राउंड टास्क' कॉल करने के बाद: 'ऐप' सेटप्लेइंग को कॉल करने में सक्षम नहीं होगा: 'फिर – Andrei