0

我们的应用程序通过成为远程控制事件的第一响应者,明确地阻止使用远程控制的用户表单,例如,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. 终于加了

(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;
        }
    }
}

任何指针将不胜感激。

4

2 回答 2

1

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

于 2013-10-30T15:20:32.100 回答
1

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

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

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

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

Bug 1:如果先在音乐遥控器上进行进入呼叫,则无法从音乐遥控器进行音频会话中断听众的退出呼叫。

Bug 2:控制中心的音乐遥控器不符合遥控事件机制。

我只是很惊讶没有人报告过这件事。

我想我会提交一份错误报告,除非有人提出不同的建议。

更新 错误 2 是一个误报。在通过 iOS7 SDK 彻底重建所有内容后,我们发现问题消失了。错误 1 ​​仍然存在。

于 2013-10-31T14:14:24.097 回答