我们的应用程序通过成为远程控制事件的第一响应者,使用远程控制(例如,来自iOS7之前的旧跳板,耳塞式)明确阻止用户表单 . 但是,在iOS7上,相同的代码无法绕过控制中心音乐控件 .
从测试开始,控制中心似乎绕过了所有音乐控制事件,包括UIEventSubtypeRemoteControlPause和UIEventSubtypeRemoteControlPlay,以及UIEventSubtypeRemoteControlTogglePlayPause .
控制中心是否有自己的远程控制协议,或者在iOS7中拦截远程控制事件的方式是否已经改变?
相同的阻止代码仍然可以与iOS6设备完美配合 . 这是我们做的:
- 在我们的appDelegate中添加了一个方法:
(BOOL)canBecomeFirstResponder {return YES; }
- 在applicationDidBecomeActive中调用它:
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
//将自己设置为第一个响应者[self becomeFirstResponder];
- 在applicationWillResignActive中调用此方法
//关闭远程控制事件传递[[UIApplication sharedApplication] endReceivingRemoteControlEvents];
//作为第一响应者辞职[self resignFirstResponder];
- 最后添加
(void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent {
if (receivedEvent.type == UIEventTypeRemoteControl) {
switch (receivedEvent.subtype) {
case UIEventSubtypeRemoteControlTogglePlayPause:
NSLog(@"Received: UIEventSubtypeRemoteControlTogglePlayPause\n");
break;
case UIEventSubtypeRemoteControlPreviousTrack:
NSLog(@"Received: UIEventSubtypeRemoteControlPreviousTrack\n");
break;
case UIEventSubtypeRemoteControlNextTrack:
NSLog(@"Received: UIEventSubtypeRemoteControlNextTrack\n");
break;
case UIEventSubtypeRemoteControlPlay:
NSLog(@"Received: UIEventSubtypeRemoteControlPlay\n");
break;
case UIEventSubtypeRemoteControlPause:
NSLog(@"Received: UIEventSubtypeRemoteControlPause\n");
break;
case UIEventSubtypeRemoteControlStop:
NSLog(@"Received: UIEventSubtypeRemoteControlStop\n");
break;
default:
NSLog(@"Received: Some remove control events\n");
break;
}
}
}
任何指针将不胜感激 .
2 回答
你不能阻止音乐应用程序 . 你的应用程序可以成为一个(苹果不会那样),然后控制中心将控制你的
我想我对发生的事情有了更好的了解,至少在CoreAudio级别 .
当应用程序的音频会话类别是单独环境时,音乐应用程序的播放事件会触发类似于闹钟或电话的音频会话中断 . 这将触发app的音频会话中断监听器回调,具有“进入中断”状态 .
但是,音乐应用程序的暂停事件不会触发具有“退出中断”状态的侦听器回调,正如人们所期望的那样 . 这个丢失的退出电话有效地冻结了我们应用的音频会话 . 退出控制中心也不会触发它 . 同样的事情适用于物理遥控器,除了可以使用我在上一封电子邮件中说的firstResponder技巧阻止物理遥控器 . 它不适用于Control Center .
除非我遗漏了一些明显的东西,否则我更确信在CoreAudio或命令链中的其他框架中存在两个错误 .
错误1:如果首先进行入口呼叫,则无法通过音乐遥控器进行音频会话中断监听器的退出呼叫 .
错误2:Control Center的音乐遥控器不符合遥控事件机制 .
我很惊讶没有人报道过这个 .
我想我会提交一份错误报告,除非有人提出不同意见 .
UPDATE 错误2是误报 . 在通过iOS7 SDK清理重建所有内容几次后,我们发现问题消失了 . 错误1仍然存在 .