2015-04-21 11 views
30

मेरा ऐप AVPlayer के माध्यम से ऑडियो स्ट्रीमिंग चलाता है, और डिवाइस लॉक स्क्रीन पर स्ट्रीम के बारे में जानकारी प्रदर्शित करने के लिए MPNowPlayingInfoCenter का उपयोग करता है।MPNowPlayingInfoCenter ऑडियो स्ट्रीम चालू होने पर गायब हो जाता है

ऑडियो वास्तव में चल रहा है, यह ठीक काम करता है, लेकिन यदि स्ट्रीम नेटवर्क मंदी के कारण स्ट्रीम करता है (यानी मुझे AVPlayerItemPlaybackStalledNotification प्राप्त होता है) जानकारी लॉक स्क्रीन से गायब हो जाती है। लेकिन फिर अगर स्ट्रीम खेलना शुरू कर देता है, तो यह फिर से दिखाई देता है।

यह भ्रमित है क्योंकि जब लॉक स्क्रीन से अब-खेल की जानकारी गायब हो जाती है तो यह दिखाता है कि ऐप ने प्लेबैक बंद कर दिया है। लेकिन फिर यह प्लेबैक फिर से शुरू होता है, जब लॉक स्क्रीन यूआई इंगित करता है कि यह नहीं होगा।

क्या यह सुनिश्चित करने के लिए मैं कुछ कर सकता हूं कि स्ट्रीम खेलने के दौरान अब खेल की जानकारी दिखाई देगी लेकिन वर्तमान में नेटवर्क की गति के मुद्दों के कारण नहीं है? ऐसा लगता है कि एक सतत लॉक स्क्रीन यूआई रखने का एकमात्र तरीका वास्तव में नेटवर्क कनेक्शन को मारना है, जब यह स्टाल होता है, जो बेवकूफ है लेकिन कम से कम भ्रमित नहीं है।

मामले में और अधिक विस्तार करने में मदद मिलेगी:

  • एप्लिकेशन कि अधिसूचना हो जाता है, केवल एक चीज यह है यूआई अद्यतन है।
  • ऐप कभी भी वर्तमान प्रोग्राम होने पर MPNowPlayingInfoCenter को साफ़ नहीं करता है, इसलिए जब तक स्ट्रीम चलाना चाहिए, तब तक खाली डेटा नहीं दिखाना चाहिए।
+0

क्या आप एक समय पर्यवेक्षक से जानकारी केंद्र शब्दकोश सेट कर रहे हैं? उदाहरण के लिए: 'addPeriodicTimeObserverForInterval: ' – yairsz

+0

नहीं, मैं एक समय पर्यवेक्षक का उपयोग नहीं कर रहा हूं। अब-बजाने वाली जानकारी केवल उपयोगकर्ता क्रियाओं के प्रत्यक्ष प्रतिक्रिया में अपडेट की जाती है और जब ऐप अग्रभूमि में प्रवेश करता है। –

+0

क्या आप 'AVPlayerItemPlaybackStalledNotification' पर सुन रहे हैं? जब आप नहीं सुनते तो क्या होता है? और आपके डेटा-स्ट्रीम को कैशिंग करने के बारे में क्या है? –

उत्तर

1

अगर मुझे अनुमान लगाना था (और यह कुछ समय हो गया है क्योंकि मैंने AVFoundation का उपयोग किया है) तो मुझे लगता है कि ऑडियो बफर के माध्यम से डेटा स्टॉप बहने के साथ ही आपका ऑडियो सत्र ओएस द्वारा निष्क्रिय किया जा रहा है। एक चाल एक दूसरा एवीप्लेयर बनाए रखना होगा जो मृत धब्बे को भरने के लिए चुप्पी वापस चलाता है जब तक कि आपने प्लेबैक फिर से शुरू करने के लिए पर्याप्त डेटा बफर नहीं किया हो या कुछ समय-समय पर पहुंच जाए और छोड़ दें। प्लेयर ऑब्जेक्ट्स के बीच स्विच करने के लिए अधिसूचना का प्रयोग करें।

1

मुझे नेटवर्क समस्या में लॉक स्क्रीन सेट करते समय कोई समस्या नहीं आ रही है।

मैं स्ट्रीमिंग से भी निपट रहा हूं।

और मुझे लगता है कि ऑडियो सत्र सक्रिय होने पर या तो लॉक स्क्रीन केवल प्रभावित होती है।

यहां आप मेरा कोड देख सकते हैं और मुझे कोई समस्या नहीं आ रही है उम्मीद है कि यह आपकी मदद करेगा।

-(void)setLockScreen 
{ 
    Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter"); 
    if (playingInfoCenter) 
    { 
     [[AVAudioSession sharedInstance] setActive:YES error:nil]; 
     NSError *myErr; 
     if (![[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&myErr]) 
     { 
      // Handle the error here. 
      NSLog(@"Audio Session error %@, %@", myErr, [myErr userInfo]); 
     } 
     else 
     { 
      [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
      [self becomeFirstResponder]; 
     } 
     MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage:imgViewLogo.image]; 
     NSArray *keys = [NSArray arrayWithObjects: 
         MPMediaItemPropertyTitle, 
         MPMediaItemPropertyArtist, 
         MPMediaItemPropertyArtwork, 
         MPNowPlayingInfoPropertyPlaybackRate, 
         nil]; 
     NSArray *values = [NSArray arrayWithObjects: 
          [[self.arrChannel objectAtIndex:[AppDelegate sharedAppDelegate].selectedRow] objectForKey:@"name"], 
          [[AppDelegate sharedAppDelegate].dictChannelsConfig objectForKey:@"venueName"], 
          albumArt, 
          [NSNumber numberWithInt:1], 
          nil]; 
     NSDictionary *mediaInfo = [NSDictionary dictionaryWithObjects:values forKeys:keys]; 
     keys = nil; 
     values = nil; 
     albumArt = nil; 
     [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:mediaInfo]; 
     mediaInfo = nil; 
    } 

} 
+0

क्या स्टॉल होने पर आप इस विधि को कॉल करते हैं? –

+0

जब मैं अपना ऑडियो वहां हूं, तो मैं बस इस विधि को बुला रहा हूं, मेरा मतलब है कि उपयोगकर्ता हिट प्ले और ऑडियो स्ट्रीमिंग है तो मैं इस विधि को कॉल कर रहा हूं। –

+0

उस स्थिति में यह जो कुछ भी मैं कर रहा हूं उससे अलग नहीं है। मैं ऑडियो सत्र को सक्रिय करता हूं, उसी ऑडियो श्रेणी का उपयोग करता हूं, और 'MPNowPlayingInfoCenter' को जानकारी पास करता हूं। क्या आपको 'AVPlayerItemPlaybackStalledNotification' प्राप्त होता है? –

संबंधित मुद्दे