这里是一些背景信息,否则跳到粗体问题。我正在构建一个应用程序,我希望它能够访问远程控制/锁屏事件。棘手的部分是这个应用程序本身不播放音频,它控制附近另一台设备的音频。当应用程序在前台时,设备之间的通信不是问题。正如我刚刚发现的那样,应用程序在使用播放 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展示如何做到这一点。
以下是必须发生的事情的简要概述:
您需要创建
UIApplication
的子类。 当文档说UIResponder
时,它的意思是UIApplication
,因为您的应用程序类是UIResponder
的子类。子类,您将要实现remoteControlReceivedWithEvent:
和canBecomeFirstResponder
方法。您想要从canBecomeFirstResponder
返回YES
。在远程控制方法中,您可能希望通知您的音频播放器某些内容已更改。您需要告诉 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 。可选:您应该配置一个 Audio Session 。这不是必需的,但如果您不这样做,则在电话静音时音频将不会播放。我在演示应用程序的委托(delegate)中执行此操作,但会在适当的时候执行。
玩点东西。在您这样做之前, Remote 将忽略您的应用程序。我刚刚拿了一个
AVPlayer
并给了它我希望启动的流媒体站点的 URL。如果您发现它失败了,请将您自己的 URL 放在那里并尽情使用它。
这个例子有更多的代码来注销远程事件,但并没有那么复杂。我只是定义并传递一些字符串常量。
我敢打赌,一个无声循环的 MP3 文件将有助于您实现目标。
关于objective-c - 接收没有音频的远程控制事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10885047/