接收没有音频的遥控事件

时间:2012-06-04 16:54:34

标签: objective-c ios ios5 avaudiosession remote-control

以下是一些背景信息,否则以粗体显示问题。我正在构建一个应用程序,我希望它可以访问远程控制/锁屏事件。棘手的部分是这个应用程序本身不播放音频,它控制附近另一台设备的音频。当应用程序位于前台时,设备之间的通信不是问题。正如我刚刚发现的那样,一个应用程序不会控制遥控器,直到它播放音频与播放音频会话,并且是最后一次这样做。这提出了一个问题,因为正如我所说,该应用程序控制另一个设备的音频,而不需要自己播放。

我的第一个倾向是让应用程序在每次打开时播放静音剪辑,以便控制遥控器。我必须这样做的事实让我想知道我是否会被苹果公司允许这样做,或者是否有另一种方法可以实现这一目标,而不会使用假音频片段欺骗系统。

问题:Apple会批准一个播放静音音频片段的应用,以便控制远程/锁定屏幕控制以控制其他设备的音频吗?有没有办法在没有音频会话的情况下控制遥控器?

P.S。我更喜欢在iOS 4.0及更高版本上使用此功能。

P.P.S我见过this similar question,它让我头脑风暴,但提供的答案并不是我需要知道的具体内容。

2 个答案:

答案 0 :(得分:25)


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

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

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


您肯定需要音频播放器,但不一定需要显式会话来控制远程控制事件。 (AVAudioSession隐含在任何播放音频的应用中。)我花了相当多的时间玩这个以确认这一点。

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

我做了a demo project来说明如何做到这一点。

以下简要介绍了必须发生的事情:

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

  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. 可选:您应该配置音频会话。这不是必需的,但如果不这样做,如果手机静音,音频将无法播放。我在演示应用程序的委托中执行此操作,但在适当的位置执行此操作。

  4. 玩点东西。在此之前,遥控器将忽略您的应用程序。我刚刚拿了一个AVPlayer并给了它一个我期待的流媒体网站的URL。如果您发现它失败了,请将您自己的网址放在那里并根据您的内容进行播放。

  5. 这个例子中有一些代码用于注销远程事件,但并不是那么复杂。我只是定义并传递一些字符串常量。

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

答案 1 :(得分:1)

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

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