如何阻止iOS 7控制中心控制音乐应用程序?

时间:2013-10-30 15:16:40

标签: ios objective-c appdelegate remote-control control-center

我们的应用程序使用远程控制显式阻止用户表单,例如,来自iOS7之前的旧跳板,耳塞式,成为远程控制事件的第一响应者。但是,在iOS7上,相同的代码无法绕过控制中心音乐控件。

从测试开始,控制中心似乎绕过了所有音乐控制事件,包括UIEventSubtypeRemoteControlPause和UIEventSubtypeRemoteControlPlay,以及UIEventSubtypeRemoteControlTogglePlayPause。

控制中心是否有自己的远程控制协议,或者在iOS7中拦截远程控制事件的方式是否有所改变?

相同的阻止代码仍然可以与iOS6设备完美配合。以下是我们的工作:

  1. 在我们的appDelegate中添加了一个方法:

    (BOOL)canBecomeFirstResponder { 返回YES; }

  2. 在applicationDidBecomeActive中调用它:

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

    //将自己设置为第一个响应者 [self becomeFirstResponder];

  3. 在applicationWillResignActive

    中调用此方法

    //关闭远程控制事件传递 [[UIApplication sharedApplication] endReceivingRemoteControlEvents];

    //作为第一响应者辞职 [self resignFirstResponder];

  4. 最后添加了

  5. (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 个答案:

答案 0 :(得分:1)

你无法阻止音乐应用。你的应用程序可以成为一个(苹果不会那样),然后控制中心可以控制你的

答案 1 :(得分:1)

我想我对发生的事情有了更好的了解,至少在CoreAudio层面。

当应用程序的音频会话类别为单独环境时,音乐应用程序的播放事件会触发类似于闹钟或电话的音频会话中断。这个 将以“进入中断”状态触发应用程序的音频会话中断监听器回调。

然而,正如人们所期望的那样,音乐应用程序的暂停事件不会触发具有“退出中断”状态的侦听器回调。这个丢失的退出电话有效地冻结了我们应用的音频会话。退出控制中心也不会触发它。同样的事情适用于物理遥控器,除了可以使用我在上一封电子邮件中说的firstResponder技巧阻止物理遥控器。它不适用于Control Center。

除非我遗漏了一些明显的东西,否则我更确信在CoreAudio或命令链中的其他框架中存在两个错误。

问题1:如果首先进行了入口呼叫,则音频会话中断监听器的退出呼叫无法通过音乐遥控器进行。

错误2:Control Center的音乐遥控器不符合遥控事件机制。

我很惊讶没有人报道过这个。

我想我会提交错误报告,除非有人提出不同意见。

<强>更新 错误2是一个误报。在通过iOS7 SDK清理重建所有内容几次后,我们发现问题消失了。错误1仍然存在。