objective-c - 接收没有音频的远程控制事件

标签 objective-c ios ios5 avaudiosession remote-control

这里是一些背景信息,否则跳到粗体问题。我正在构建一个应用程序,我希望它能够访问远程控制/锁屏事件。棘手的部分是这个应用程序本身不播放音频,它控制附近另一台设备的音频。当应用程序在前台时,设备之间的通信不是问题。正如我刚刚发现的那样,应用程序在使用播放 Audio Session 播放音频之前不会承担对 Remote 的控制,并且是最后一次这样做。这会带来一个问题,因为就像我说的,该应用程序控制着另一台设备的音频并且不需要播放自己的音频。

我的第一个想法是让应用程序在每次打开时播放一段无声片段,以便承担 Remote 的控制权。我必须这样做的事实让我想知道 Apple 是否会允许我这样做,或者是否有另一种方法可以在不使用假音频剪辑欺骗系统的情况下实现这一点。

问题:Apple 是否会批准播放无声音频剪辑的应用程序,以便控制远程/锁定屏幕控件以控制另一台设备的音频?有没有办法在没有 Audio Session 的情况下假设对 Remote 的控制?

附言我更愿意在 iOS 4.0 及更高版本上使用此功能。

P.P.S 我看过this similar question它让我集思广益,但所提供的答案并不特定于我需要知道的内容。

最佳答案


注意:从 iOS 7.1 开始,您应该使用 MPRemoteCommandCenter而不是下面的答案。

您创建 MPRemoteCommand 的各种系统提供的子类并将它们分配给 [MPRemoteCommandCenter sharedCommandCenter] 的属性。

我保留了其余部分以供历史引用,但不能保证以下内容适用于最新的 iOS 版本。事实上,它可能不会。


您确实需要音频播放器,但不一定需要显式 session 来控制远程控制事件。 (AVAudioSession 对任何播放音频的应用都是隐含的。)我花了相当多的时间来验证这一点。

我在 Internet 上看到很多关于在哪里设置 removeControlEventRecievedWithEvent: 方法和响应者链的各种方法的混淆。我知道这种方法适用于 iOS 6 和 iOS 7。其他方法没有。不要浪费时间在应用程序委托(delegate)(它们曾经工作的地方)或 View Controller 中处理远程控制事件,这些事件可能会在应用程序的生命周期内消失。

我做了 a demo project展示如何做到这一点。

以下是必须发生的事情的简要概述:

  1. 您需要创建 UIApplication 的子类。 当文档说 UIResponder 时,它的意思是 UIApplication,因为您的应用程序类是 UIResponder 的子类。子类,您将要实现 remoteControlReceivedWithEvent:canBecomeFirstResponder 方法。您想要从 canBecomeFirstResponder 返回 YES。在远程控制方法中,您可能希望通知您的音频播放器某些内容已更改。

  2. 您需要告诉 iOS 使用您的自定义类来运行应用程序,而不是默认的 UIApplication。为此,打开 main.m 并更改它:

     return UIApplicationMain(argc, argv, nil, NSStringFromClass([RCAppDel`egate class]));
    

    看起来像这样:

    return UIApplicationMain(argc, argv, NSStringFromClass([RCApplication class]), NSStringFromClass([RCAppDelegate class]));
    

    在我的例子中,RCApplication 是我自定义类的名称。请改用您的子类的名称。不要忘记 #import 适当的 header 。

  3. 可选:您应该配置一个 Audio Session 。这不是必需的,但如果您不这样做,则在电话静音时音频将不会播放。我在演示应用程序的委托(delegate)中执行此操作,但会在适当的时候执行。

  4. 玩点东西。在您这样做之前, Remote 将忽略您的应用程序。我刚刚拿了一个 AVPlayer 并给了它我希望启动的流媒体站点的 URL。如果您发现它失败了,请将您自己的 URL 放在那里并尽情使用它。

这个例子有更多的代码来注销远程事件,但并没有那么复杂。我只是定义并传递一些字符串常量。

我敢打赌,一个无声循环的 MP3 文件将有助于您实现目标。

关于objective-c - 接收没有音频的远程控制事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10885047/

相关文章:

ios - 将 segues 用于以编程方式构建的 tableview 单元格

ios - 在iOS5中使用UIDevice uniqueIdentifier进行通知

objective-c - UIActivityViewController 不显示 "Open in iBooks"选项

objective-c - 如何通过 CGRect 过滤 NSArray 中的 CGPoints

ios - 如何在 iOS 的 Collection View 中从底部删除多余的空间?

ios - 在 swift 3 中显示来自自定义单元格的警报

objective-c - 什么时候在 iOS 的 ARC 中发布强大的属性?

ios - UICollectionView 在刷新时重复和重新排序单元格内容

ios - 隐藏在 View 后面的 UIAlertView

core-data - 核心数据关系删除规则 - Nullify + Cascade