【问题标题】:Receive remote control events without audio接收没有音频的远程控制事件
【发布时间】:2012-06-08 17:55:48
【问题描述】:

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

我的第一个想法是让应用程序在每次打开时播放一个静音剪辑,以便控制遥控器。我必须这样做的事实让我想知道 Apple 是否会允许我这样做,或者是否有其他方法可以实现这一点,而不会用假音频剪辑欺骗系统。

问题:Apple 是否会批准一个应用程序播放无声音频剪辑,以控制远程/锁定屏幕控件以控制其他设备的音频?有没有什么方法可以在没有音频会话的情况下控制遥控器?

附:我希望在 iOS 4.0 及更高版本上拥有此功能。

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

【问题讨论】:

  • 您找到解决方案了吗? Apple 会批准一款播放无声音频剪辑的应用程序来控制智能电视/流媒体盒上的投射视频吗?还知道 Spotify、Sonos 和 Youtube 是如何实现的吗?

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


【解决方案1】:

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

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

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


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

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

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

以下是必须发生的事情的简要说明:

  1. 您需要创建UIApplication 的子类。 当文档说UIResponder 时,它表示UIApplication,因为您的应用程序类是UIResponder 的子类。 在这个子类中,您将实现remoteControlReceivedWithEvent: 和@987654332 @ 方法。您想从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 相应的标题。

  3. 可选:您应该配置音频会话。这不是必需的,但如果您不这样做,如果手机静音,音频将不会播放。我在演示应用的委托中执行此操作,但在适当的情况下执行此操作。

  4. 播放一些东西。在您这样做之前,遥控器将忽略您的应用程序。我只是拿了一个AVPlayer 并给了它一个我希望能启动的流媒体网站的 URL。如果你发现它失败了,把你自己的 URL 放在那里,尽情地玩吧。

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

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

【讨论】:

  • 哇,谢谢!回家后我会查看演示。现在你说这里的方法适用于 iOS 6 和 7;您是否知道它是否会追溯到 5.1?
  • 我不确定,但我认为重大变化发生在 iOS 6 和 7 之间,所以我认为它适用于 iOS 5。
  • 我刚刚为运行 iOS 5 的 iPad 充电并尝试在其上运行演示。起初它不起作用,但如果你关闭自动布局和 iOS 6+ 本地化功能(并将未本地化的 nib 复制回去),它基本上可以工作。我说主要是因为播放/暂停按钮有问题。 (我认为这只是我没有正确解释的事件类型。运行它,你就会明白我的意思了。)
  • 你真是个天才,这正是我想要的!还有一个问题 - 为了让我的应用程序接收远程控制事件,它必须是最后一个播放任何类型音频的应用程序。对吗?
  • 在这里尝试了一堆其他解决方案,这是唯一真正让我得到事件的解决方案,最后,谢谢!!!!
【解决方案2】:

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

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

【讨论】:

  • Apple 是否会批准一款可以播放无声音频片段来控制智能电视/流媒体盒上的投射视频的应用程序?还知道 Spotify、Sonos 和 Youtube 是如何实现的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 2012-09-02
相关资源
最近更新 更多