2012-04-23 25 views
8

में रीसाइविंग रिमोट कंट्रोल इवेंट्स शुरू नहीं हो सकता है मेरे ऐप में मैं पृष्ठभूमि में ऑडियो प्लेबैक को नियंत्रित करने देना चाहता हूं। मैंने वापस .plist में ग्राउंड मोड सेट किए हैं, और बीजी में नाटकों में जैसे मैं चाहता था। लेकिन मुझे नियंत्रण बटन को छूने से कोई प्रतिक्रिया नहीं मिल सकती है।आईओएस

मैं viewContoller में फिर AudioSession इस

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
[[AVAudioSession sharedInstance]setActive:YES error:nil]; 

की तरह सेट किया, जहाँ मेरे खिलाड़ी इस

if ([[UIApplication sharedApplication] respondsToSelector:@selector(beginReceivingRemoteControlEvents)]){ 
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; 
    [self becomeFirstResponder]; 
    NSLog(@"Responds!"); 
} 

की तरह मैं beginReceivingRemoteControlEvents रखा गया है और यह Responds!

प्रिंट लेकिन समस्या यह है कि है इस विधि को कभी भी

नहीं कहा जाता है
- (void)remoteControlReceivedWithEvent:(UIEvent *)event 
{ 
    NSLog(@"Where is my event?"); 
    if(event.type == UIEventTypeRemoteControl) 
    { 
     switch (event.subtype) { 
      case UIEventSubtypeRemoteControlTogglePlayPause: 
       NSLog(@"Pause"); 
       [self playWords:playButton]; 
       break; 
      case UIEventSubtypeRemoteControlNextTrack: 
       NSLog(@"Next"); 
       [self next]; 
       break; 
      case UIEventSubtypeRemoteControlPreviousTrack: 
       NSLog(@"Prev"); 
       [self prev]; 
       break; 

     } 
    } 

मैं भी UIApplication पर एक वर्ग लिखने के लिए यह पहली प्रत्युत्तर बनने की कोशिश की, लेकिन यह मदद नहीं करता है

@implementation UIApplication (RemoteEvents) 
-(BOOL)canBecomeFirstResponder 
{ 
    return YES; 
} 
@end 

ऐसा क्यों हो सकता है?

समाधान यहाँ मेरी समस्या Entering background on iOS4 to play audio

उत्तर

13

हल मैं अपने प्रोजेक्ट में एक ही काम किया है, यह ठीक काम कर रहा है। कृपया इसका पालन करें, शायद यह आपकी मदद करेगा। इवेंट का नाम बदलें आदि। मेरे कोड में _audio AVAudioPlayer का ऑब्जेक्ट है।

- (void)viewDidLoad { 
    NSError *setCategoryErr = nil; 
    NSError *activationErr = nil; 
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryErr]; 
    [[AVAudioSession sharedInstance] setActive: YES error: &activationErr]; 
} 

- (void)viewWillAppear { 

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


- (void)remoteControlReceivedWithEvent:(UIEvent *)event { 
    switch (event.subtype) { 
     case UIEventSubtypeRemoteControlPlay: 
      [_audio play]; 
      break; 
     case UIEventSubtypeRemoteControlPause: 
      [_audio pause]; 
      break; 
     default: 
      break; 
    } 
} 
+0

धन्यवाद, लेकिन जहां तक ​​मैं देख सकता हूं, यह वही –

+0

एक और बात यह है कि आप सिम्युलेटर पर इसका परीक्षण नहीं कर सकते हैं, अगर आप सिम्युलेटर का उपयोग घटनाओं और बैकग्राउंग संगीत को हटाने के लिए सिम्युलेटर का उपयोग कर रहे हैं। –

+0

मैं डिवाइस पर परीक्षण करता हूं) –

1

ऐप्पल से उपयोग के उदाहरण के लिए इस sample code की समीक्षा करें। संभावना है कि आपका प्राथमिक दृश्य नियंत्रक वास्तव में पहला उत्तरदाता नहीं बन रहा है। एक वैकल्पिक उपयोग इस कोड को आपके एप्लिकेशन प्रतिनिधि (जो हमेशा पहले उत्तरदाता होगा) में रखना होगा और इन घटनाओं का जवाब देने से पहले उन्हें प्रसारित करने का मौका मिलेगा, और अन्य उत्तरदाताओं द्वारा संभावित रूप से उपभोग किया जा सकता है।

0

आप

respondsToSelector:@selector(beginReceivingRemoteControlEvents)]){ 

है, लेकिन विधि हस्ताक्षर में आप

- (void)remoteControlReceivedWithEvent:(UIEvent *)event 

जगह है जहाँ आप हस्ताक्षर दर्ज कर रहे हैं गलत है। बस इसे

respondsToSelector:@selector(beginReceivingRemoteControlEvents:)]){ 

आप गायब हैं: जो ऐप को एक मौजूदा विधि तक भी भेज रहा है जिसे मैं मान रहा हूं। मुझे आश्चर्य है कि आपका ऐप क्रैश नहीं हो रहा है।

4

रिमोट कंट्रोल ईवेंट सुनने के लिए एक नया तंत्र है।उदाहरण के लिए, एक ब्लॉक जब हेड फोन्स चलाएं/रोकें बटन दबाने पर अमल करने:

MPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter]; 

    [commandCenter.togglePlayPauseCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) { 
     NSLog(@"toggle button pressed"); 
     return MPRemoteCommandHandlerStatusSuccess; 
    }]; 

या, आप एक ब्लॉक के बजाय एक विधि का उपयोग करना पसंद करते हैं:

[commandCenter.togglePlayPauseCommand addTarget:self action:@selector(toggleButtonAction)]; 

रोकने के लिए:

[commandCenter.togglePlayPauseCommand removeTarget:self]; 

या:

[commandCenter.togglePlayPauseCommand removeTarget:self action:@selector(toggleButtonAction)]; 

आप को जोड़ने के लिए अपनी फ़ाइल का क्षेत्र भी शामिल है इस की आवश्यकता होगी:

@import MediaPlayer; 

यह पृष्ठभूमि में काम करने के लिए, आप पृष्ठभूमि ऑडियो मोड अपने अनुप्रयोग की क्षमताओं को जोड़ा गया होना आवश्यक है।

+0

यह मेरा दिन बना दिया। अनेक अनेक धन्यवाद!!! –