2012-04-23 27 views
8

Trong ứng dụng của tôi, tôi muốn cho phép người dùng điều khiển phát lại âm thanh dưới nền. Tôi thiết lập chế độ backGround trong .plist, và trong lượt chơi trong bg giống như tôi muốn. Nhưng tôi không thể nhận được bất kỳ phản ứng nào từ việc chạm vào các nút điều khiển.Không thể bắt đầuReceivingRemoteControlEvents trong iOS

tôi đặt AudioSession như thế này

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

Sau đó, trong viewContoller nơi máy nghe nhạc của tôi được đặt i beginReceivingRemoteControlEvents như thế này

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

Và nó in Responds!

Nhưng vấn đề là phương pháp này không bao giờ được gọi là

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

     } 
    } 

Tôi thậm chí đã cố gắng để viết một thể loại trên UIApplication để cho nó trở thành responder đầu tiên, nhưng nó không giúp

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

Tại sao điều này có thể xảy ra?

SOLUTION Đây là những gì giải quyết vấn đề của tôi Entering background on iOS4 to play audio

Trả lời

13

Tôi đã làm công việc tương tự trong dự án của tôi, nó làm việc tốt. Hãy làm theo điều này, có lẽ nó sẽ giúp bạn. Thay đổi tên sự kiện vv. Trong mã của tôi _audio là đối tượng của 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

Cảm ơn bạn, nhưng theo như tôi có thể thấy, nó chỉ giống nhau –

+0

Một điều nữa là bạn không thể thử nghiệm trên trình mô phỏng, sử dụng thiết bị nếu bạn đang sử dụng trình mô phỏng để kiểm tra xóa sự kiện và nhạc nền. –

+0

Tôi thử nghiệm trên thiết bị) –

1

Xem lại điều này sample code từ Apple để biết ví dụ về cách sử dụng. Có khả năng bộ điều khiển xem chính của bạn không thực sự trở thành người trả lời đầu tiên. Một cách sử dụng thay thế là đặt mã này trong Application Delegate của bạn (sẽ luôn là người trả lời đầu tiên) và trả lời những sự kiện này trước khi chúng có cơ hội truyền bá và có khả năng được những người trả lời khác tiêu thụ.

0

Bạn có

respondsToSelector:@selector(beginReceivingRemoteControlEvents)]){ 

nhưng trong chữ ký phương pháp bạn có

- (void)remoteControlReceivedWithEvent:(UIEvent *)event 

Nơi bạn đang đăng ký chữ ký là sai. Chỉ cần thay thế nó bằng cách

respondsToSelector:@selector(beginReceivingRemoteControlEvents:)]){ 

Bạn đang thiếu: làm cho ứng dụng gửi ngay cả đến một phương pháp không tồn tại mà tôi giả định. Tôi ngạc nhiên khi ứng dụng của bạn không bị lỗi.

4

Có cơ chế mới hơn để nghe các sự kiện điều khiển từ xa.Ví dụ, để thực hiện một khối khi/nút tai nghe chơi tạm dừng được nhấn:

MPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter]; 

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

hoặc, nếu bạn thích sử dụng một phương pháp thay vì một khối:

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

Để dừng:

[commandCenter.togglePlayPauseCommand removeTarget:self]; 

hay:

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

Bạn sẽ cần thêm phần này vào vùng bao gồm tệp của mình:

@import MediaPlayer; 

Để nó hoạt động ở chế độ nền, bạn phải có chế độ âm thanh nền được thêm vào khả năng của ứng dụng.

+0

Điều này làm cho ngày của tôi. Cảm ơn một tấn !!! –