我们的应用程序使用远程控制显式阻止用户表单,例如,来自iOS7之前的旧跳板,耳塞式,成为远程控制事件的第一响应者。但是,在iOS7上,相同的代码无法绕过控制中心音乐控件。
从测试开始,控制中心似乎绕过了所有音乐控制事件,包括UIEventSubtypeRemoteControlPause和UIEventSubtypeRemoteControlPlay,以及UIEventSubtypeRemoteControlTogglePlayPause。
控制中心是否有自己的远程控制协议,或者在iOS7中拦截远程控制事件的方式是否有所改变?
相同的阻止代码仍然可以与iOS6设备完美配合。以下是我们的工作:
在我们的appDelegate中添加了一个方法:
(BOOL)canBecomeFirstResponder { 返回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;
}
}
}
任何指针都会受到赞赏。
答案 0 :(得分:1)
你无法阻止音乐应用。你的应用程序可以成为一个(苹果不会那样),然后控制中心可以控制你的
答案 1 :(得分:1)
我想我对发生的事情有了更好的了解,至少在CoreAudio层面。
当应用程序的音频会话类别为单独环境时,音乐应用程序的播放事件会触发类似于闹钟或电话的音频会话中断。这个 将以“进入中断”状态触发应用程序的音频会话中断监听器回调。
然而,正如人们所期望的那样,音乐应用程序的暂停事件不会触发具有“退出中断”状态的侦听器回调。这个丢失的退出电话有效地冻结了我们应用的音频会话。退出控制中心也不会触发它。同样的事情适用于物理遥控器,除了可以使用我在上一封电子邮件中说的firstResponder技巧阻止物理遥控器。它不适用于Control Center。
除非我遗漏了一些明显的东西,否则我更确信在CoreAudio或命令链中的其他框架中存在两个错误。
问题1:如果首先进行了入口呼叫,则音频会话中断监听器的退出呼叫无法通过音乐遥控器进行。
错误2:Control Center的音乐遥控器不符合遥控事件机制。
我很惊讶没有人报道过这个。
我想我会提交错误报告,除非有人提出不同意见。
<强>更新强> 错误2是一个误报。在通过iOS7 SDK清理重建所有内容几次后,我们发现问题消失了。错误1仍然存在。