首页 文章

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

提问于
浏览
0

我们的应用程序通过成为远程控制事件的第一响应者,使用远程控制(例如,来自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 回答

  • 1

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

  • 1

    我想我对发生的事情有了更好的了解,至少在CoreAudio级别 .

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

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

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

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

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

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

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

    UPDATE 错误2是误报 . 在通过iOS7 SDK清理重建所有内容几次后,我们发现问题消失了 . 错误1仍然存在 .

相关问题