【问题标题】:How to block iOS 7 control centre from controlling music app?如何阻止 iOS 7 控制中心控制音乐应用程序?
【发布时间】:2013-11-10 06:56:38
【问题描述】:

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

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

是控制中心有自己的远程控制协议还是iOS7中拦截远程控制事件的方式发生了变化?

相同的阻塞代码仍然适用于 iOS6 设备。这是我们的工作:

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

    (BOOL)canBecomeFirstResponder { 返回是; }

  2. 在 applicationDidBecomeActive 中调用它:

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

    // 将自己设置为第一响应者 [自己成为FirstResponder];

  3. 在 applicationWillResignActive 中调用它

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

    // 辞去第一响应者的职务 [自我辞职FirstResponder];

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

任何指针将不胜感激。

【问题讨论】:

  • 为什么要投票给我?这是一个现实的问题。

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


【解决方案1】:

您无法屏蔽音乐应用。你的应用可以成为一个(苹果不会喜欢这样),然后控制中心会控制你的

【讨论】:

  • @kakyo 远程控制事件处理是为了让您的应用程序可以通过控制中心、耳塞等进行控制……这并不是为了让您的应用程序可以吃掉所述控件,从而阻止对 的控制来自上述来源的其他应用。由于 iOS 中的一个错误,它仅在 iOS6 中有效,现已在 iOS7 中修复。
  • @bbum,感谢您的澄清。没想到这是一个错误,因为我在官方 xcode 邮件列表中获得了解决方案......但是如果启动音乐应用程序在任何情况下都劫持了我的应用程序的音频,那么解决方案是什么?我想这值得另一个问题。
  • 您是否使用无声音频作为背景?
  • @LeoNatan 不允许使用背景音频。我们使用solo-ambient 作为音频会话类别。因此,我们希望在我们的应用处于前台时不会混合其他音频。
  • @kakyo 我只是在阅读文档;如果您认为新行为确实是一个错误,请通过 bugreporter.apple.com 提交一个,当然!
【解决方案2】:

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

当应用的音频会话类别为单人环境时,音乐应用的播放事件会触发类似于闹钟或电话的音频会话中断。这 将触发应用的音频会话中断监听回调,状态为“enter-interruption”。

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    相关资源
    最近更新 更多