2014-11-18 7 views
5

मेरे पास एक ऐसा एप्लिकेशन है जो पृष्ठभूमि में ऑडियो चलाता है। मैं एक बग को ठीक करने की कोशिश कर रहा हूं जहां होम स्क्रीन (ऑडियो) पर ऑडियो नियंत्रण (प्ले/पॉज़) है, आईओएस 8.0+ पर काम न करें लेकिन आईओएस 7.0 पर ठीक काम करें। मैं यह पता लगाने की कोशिश कर रहा हूं कि समस्या क्या है और खाली हो रही है। किसी भी विचार की बहुत प्रशंसा की जाएगी। यहां मेरे पास जगह है।रिमोट कंट्रोल रिसीवइडथथेंट आईओएस 7.0 डिवाइस पर कॉल किया गया लेकिन आईओएस 8.0

प्रोजेक्ट सेटिंग्स में: मैंने यह सुनिश्चित किया है कि UIBackgroundModesaudio पर सेट है।

AppDelegate.h में: मैं AVAudioSession* session; के लिए एक सदस्य के रूप में अच्छी तरह से AVPlayer *audioPlayer;

AppDelegate.m में है:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 

self.session = [AVAudioSession sharedInstance]; 

NSError* error = NULL; 
[self.session setCategory:AVAudioSessionCategoryPlayback error:&error]; 
[self.session setActive:YES error:&error]; 

if (error) { 
    NSLog(@"AVAudioSession error: %@", [error localizedDescription]); 
} 

AudioPlayerViewController.m में

- (void)viewDidLoad { 

//Get the Audio 
NSURL *url = [NSURL URLWithString:self.audioUrl]; 
AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil]; 

//Setup the player 
self.playerItem = [AVPlayerItem playerItemWithAsset:asset]; 
appDelegate.audioPlayer = [AVPlayer playerWithPlayerItem:self.playerItem]; 

//Setup the "Now Playing" 
NSMutableDictionary *mediaInfo = [[NSMutableDictionary alloc]init]; 
[mediaInfo setObject:self.title forKey:MPMediaItemPropertyTitle]; 
[mediaInfo setObject:self.artist forKey:MPMediaItemPropertyArtist]; 
[mediaInfo setObject:self.album forKey:MPMediaItemPropertyAlbumTitle]; 
[mediaInfo setObject:[NSNumber numberWithDouble:duration ] forKey:MPMediaItemPropertyPlaybackDuration]; 
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:mediaInfo]; 

}

// Process remote control events 
- (void) remoteControlReceivedWithEvent:(UIEvent *)event { 

NSLog(@"AudioPlayerViewController ... remoteControlReceivedWithEvent top ....subtype: %d", event.subtype); 

if (event.type == UIEventTypeRemoteControl) { 

    switch (event.subtype) { 
     case UIEventSubtypeRemoteControlTogglePlayPause: 
      [self togglePlayPause]; 
      break; 
     case UIEventSubtypeRemoteControlPause: 
      [self doPause]; 
      break; 
     case UIEventSubtypeRemoteControlStop: 
      [self doPause]; 
      break; 
     case UIEventSubtypeRemoteControlPlay: 
      [self doPlay]; 
      break; 
     case UIEventSubtypeRemoteControlPreviousTrack: 
      [self nextOrPrevTrack]; 
      break; 
     case UIEventSubtypeRemoteControlNextTrack: 
      [self nextOrPrevTrack]; 
      break; 
     default: 
      break; 
    } 
} 

}

-(void)viewDidAppear:(BOOL)animated { 
[super viewDidAppear:animated]; 
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
[self becomeFirstResponder]; 

}

- (void)viewWillDisappear:(BOOL)animated { 
[super viewWillDisappear:animated]; 
[[UIApplication sharedApplication] endReceivingRemoteControlEvents]; 
[self resignFirstResponder]; 

}

- (BOOL) canBecomeFirstResponder { 
return YES; 

}

उत्तर

8

अंत में इस मुद्दे को मैं हो रही थी पता लगा। आखिरकार ऐसा लगता था कि होम स्क्रीन पर रिमोट कंट्रोल की घटनाएं इसे मेरे ऐप में और मेरे दृश्य नियंत्रकों तक कभी नहीं बना रही थीं। मैंने UIWindow को उपclassing समाप्त कर दिया ताकि मैं देख सकूं कि श्रृंखला के माध्यम से कौन सी घटनाएं अपना रास्ता बना रही थीं। UIWindow एक UIResponder है, मैंने उप-वर्ग में - (void)remoteControlReceivedWithEvent:(UIEvent *)event भी जोड़ा। तब makeKeyAndVisible में मैं कहा:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
[self becomeFirstResponder]; 

मैं डिबगर अप शुरू कर दिया और -(void)makeKeyAndVisible कभी नहीं बुलाया गया था! मैंने फिर window सदस्य चर के लिए मेरे ऐप प्रतिनिधि की खोज की और [window makeKeyAndVisible]; लाइन कहीं भी नहीं मिली! मैंने इसे वापस जोड़ा (जैसा कि यह वहां होना चाहिए था) और प्रतिष्ठा घटनाएं जादू जैसे सही स्थानों पर जा रही हैं। यह आईओएस के कुछ संस्करणों पर क्यों काम कर रहा था और दूसरों को नहीं और बिना किसी अन्य ध्यान देने योग्य मुद्दों के मेरे बाहर है।

आशा है कि इससे भविष्य में किसी को मदद मिलेगी।

+0

आप आप कैसे यह काम कर दिया पर कुछ प्रासंगिक कोड पोस्ट कर सकते हैं? 'UIWindow' के उप-वर्गीकरण को आपने कैसे और कहाँ किया था? – NorthBlast

+0

समस्या गायब थी [खिड़की बनाने के लिए और दृश्यमान] कॉल। UIWindow कक्षा subclassing के साथ कुछ भी नहीं करने के लिए। – Caleb

4

अपने ViewController में

override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 

     UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 
     self.becomeFirstResponder() 
} 

override func remoteControlReceivedWithEvent(event: UIEvent) { 
     // your stuff 
    } 

AppDelegate में जोड़ने

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

var error: NSError? 
     AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: &error) 
     AVAudioSession.sharedInstance().setActive(true, error: &error) 
} 

स्विफ्ट 3

UIApplication.shared.beginReceivingRemoteControlEvents() 
self.becomeFirstResponder() 

do { 
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
    try AVAudioSession.sharedInstance().setActive(true) 
} catch { 
    print("hmmm...") 
} 
+0

क्या होता है जब आपके पास एकाधिक व्यू कंट्रोलर होते हैं जिनमें से वे प्लेयर हैं और आप किसी अन्य व्यू कंट्रोलर पर स्विच करते हैं। आप प्लेयर नियंत्रक में रिमोट को कैसे संभालना जारी रखते हैं जो अब "नष्ट" है? – justdan0227

+0

अच्छा बिंदु: मुझे लगता है कि आपको अपने ऐपडिलेगेट में या सिंगलटन ऑब्जेक्ट –

+0

में ऐसे व्यवहार को संभालना चाहिए, यह सही जवाब है। खिलाड़ियों को स्थैतिक होने के बाद दृश्य नियंत्रक में विधियों को कॉल करने के लिए जोड़ा गया तर्क AppDelegate। – justdan0227

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