无法在iOS中开始接收远程控制事件
在我的应用程序中,我希望让用户在后台控制音频播放。 我在.plist中设置了backGround模式,并在bg中播放就像我想要的那样。但是我无法通过触摸控制按钮得到任何响应。
我像这样设置AudioSession
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance]setActive:YES error:nil];
然后,在我放置播放器的viewContoller中,我就像这样beginReceivingRemoteControlEvents
if ([[UIApplication sharedApplication] respondsToSelector:@selector(beginReceivingRemoteControlEvents)]){ [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; [self becomeFirstResponder]; NSLog(@"Responds!"); }
它打印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
为什么会这样?
解决方案这就解决了我的问题在iOS4上输入背景来播放音频
我在我的项目中做了同样的工作,它工作正常。 请按照这个,也许它会帮助你。 更改事件名称等。在我的代码中_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; } }
有一种更新的机制来监听远程控制事件。 例如,要在按下耳机播放/暂停按钮时执行阻止:
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;
要使其在后台运行,您必须将背景音频模式添加到应用程序的function中。
查看Apple的此示例代码以获取用法示例。 可能你的主视图控制器实际上并没有成为第一个响应者。 另一种用法是将此代码放在Application Delegate(它始终是第一个响应者)中,并在它们有机会传播之前响应这些事件,并可能被其他响应者使用。
你有
respondsToSelector:@selector(beginReceivingRemoteControlEvents)]){
但是在方法签名中你有
- (void)remoteControlReceivedWithEvent:(UIEvent *)event
您注册签名的地方是错误的。 只需替换它
respondsToSelector:@selector(beginReceivingRemoteControlEvents:)]){
你错过了:这使得应用程序将偶数发送到我假设的非现有方法。 我很惊讶你的应用程序没有崩溃。