接收没有audio的遥控事件

以下是一些背景信息,否则请直接跳至粗体问题。 我正在构build一个应用程序,我希望它有权访问远程控制/锁屏事件。 棘手的部分是,这个应用程序不播放audio本身,它控制附近的另一个设备的audio。 当应用程序处于前台时,设备之间的通信不成问题。 正如我刚刚发现的,一个应用程序不会假定遥控器的控制权,直到它播放audio播放audio会话,并且是最后一次。 这提出了一个问题,因为就像我所说的,应用程序控制另一个设备的audio,并没有必要发挥自己的。

我的第一个倾向是让应用程序在每次打开时播放无声片段,以便控制遥控器。 我必须这么做的事实让我怀疑,即使我被苹果允许这样做,或者如果有另一种方法来实现这一点,而不用假audio剪辑欺骗系统。

问题:苹果是否会批准播放无声audio剪辑的应用程序,以便控制远程/locking屏幕控件以控制其他设备的audio? 有没有任何方法可以在没有audio会话的情况下控制遥控器?

附言我宁愿有这个function在iOS 4.0及以上。

PPS我已经看到了这个类似的问题 ,它让我头脑风暴,但提供的答案是不是特定于我需要知道的。


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

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

我将其余部分保留作为历史参考,但以下内容不保证可用于最新的iOS版本。 事实上,它可能不是。


你肯定需要一个audio播放器,但不一定是明确的会话来控制远程控制事件。 ( AVAudioSession隐式的播放audio的任何应用程序。)我花了相当多的时间玩这个来证实这一点。

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

我做了一个演示项目来演示如何做到这一点。

下面简要介绍一下发生的事情:

  1. 你需要创build一个UIApplication的子类。 当文档说UIResponder ,这意味着UIApplication ,因为你的应用程序类是UIResponder的子类。 在这个子类中,你将实现remoteControlReceivedWithEvent:canBecomeFirstResponder方法。 你想从canBecomeFirstResponder返回YES 。 在远程控制方法中,您可能希望通知您的audio播放器有所更改。

  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适当的标题。

  3. 可选:您应该configurationaudio会话。 这不是必需的,但如果你不这样做,如果手机静音,audio将不会播放。 我在演示应用程序的代理中这样做,但在适当的情况下这样做。

  4. 玩一些东西。 在这之前,遥控器会忽略你的应用程序。 我只是拿了一个AVPlayer并给了它一个stream式网站的URL,我希望能够起来。 如果你发现它失败了,把你自己的url放在那里,并随心所欲地播放。

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

我敢打赌,一个沉默的循环MP3文件将有助于实现你的目标。

Moshe的解决scheme对我很好! 然而,我注意到的一个问题是,当您暂停audio时,媒体控件将消失,无法重新播放应用程序,您将无法再播放它。 如果您在播放audio时在locking屏幕上设置媒体信息,则不会发生这种情况:

 NSDictionary *mediaInfo = @{MPMediaItemPropertyTitle: @"My Title", MPMediaItemPropertyAlbumTitle: @"My Album Name", MPMediaItemPropertyPlaybackDuration: [NSNumber numberWithFloat:0.30f]}; [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:mediaInfo];