Squ*_*tch 10 objective-c remote-control ios avaudiosession ios5
这是一些背景信息,否则以粗体向前跳到问题.我正在构建一个应用程序,我希望它可以访问远程控制/锁屏事件.棘手的部分是这个应用程序本身不播放音频,它控制附近另一台设备的音频.当应用程序位于前台时,设备之间的通信不是问题.正如我刚刚发现的那样,一个应用程序不会控制遥控器,直到它播放音频与播放音频会话,并且是最后一次这样做.这提出了一个问题,因为正如我所说,该应用程序控制另一个设备的音频,而不需要自己播放.
我的第一个倾向是让应用程序每次打开时播放一个静音剪辑,以便控制遥控器.事实上,我必须这样做,这让我想知道我是否会被苹果公司允许这样做,或者是否有另一种方法可以实现这一点,而不会用假音频片段欺骗系统.
问题:Apple会批准播放静音音频片段的应用程序,以便控制远程/锁定屏幕控制以控制其他设备的音频吗?有没有办法在没有音频会话的情况下控制遥控器?
PS我更喜欢在iOS 4.0及更高版本上使用此功能.
PPS我已经看到了这个类似的问题,它让我头脑风暴,但提供的答案并不是我需要知道的具体问题.
Mos*_*she 25
注意:从iOS 7.1开始,您应该使用MPRemoteCommandCenter而不是下面的答案.
您可以创建各种系统提供的MPRemoteCommand子类,并将它们分配给[MPRemoteCommandCenter sharedCommandCenter].
我将其余部分用于历史参考,但以下内容不能保证适用于最新的iOS版本.事实上,它可能不会.
你肯定需要一个音频播放器,但不一定需要一个显式会话来控制遥控器事件.(AVAudioSession对任何播放音频的应用都是隐含的.)我花了相当多的时间玩这个以确认这一点.
我在互联网上看到了很多关于在何处设置removeControlEventRecievedWithEvent:方法和响应者链的各种方法的混淆.我知道这种方法适用于iOS 6和iOS 7.其他方法都没有.不要浪费时间处理应用程序委托(他们以前工作的地方)或视图控制器中的远程控制事件,这些事件可能会在应用程序的生命周期中消失.
我做了一个演示项目来展示如何做到这一点.
以下是必须发生的事情的快速概述:
你需要创建一个子类UIApplication.当文档说UIResponder,这意味着UIApplication,因为你的应用程序类是它的子类UIResponder.在这个子类中,您将实现remoteControlReceivedWithEvent:和canBecomeFirstResponder方法.你想返回YES的canBecomeFirstResponder.在遥控方法中,您可能希望通知音频播放器某些内容已发生变化.
您需要告诉iOS使用您的自定义类来运行应用程序,而不是默认值UIApplication.为此,请打开main.m并更改:
return UIApplicationMain(argc, argv, nil, NSStringFromClass([RCAppDel`egate class]));
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
return UIApplicationMain(argc, argv, NSStringFromClass([RCApplication class]), NSStringFromClass([RCAppDelegate class]));
Run Code Online (Sandbox Code Playgroud)
在我的例子中RCApplication是我的自定义类的名称.请改用子类的名称.不要忘记#import适当的标题.
可选:您应该配置音频会话.这不是必需的,但如果不这样做,如果手机静音,音频将无法播放.我在演示应用程序的委托中执行此操作,但在适当的位置执行此操作.
玩点东西.在此之前,遥控器将忽略您的应用程序.我刚拿了一个,AVPlayer并给了它一个流媒体网站的URL,我期待它.如果您发现它失败了,请将您自己的URL放在那里并根据您的内容进行播放.
这个例子中有一些代码用于注销远程事件,但并不是那么复杂.我只是定义并传递一些字符串常量.
我敢打赌,一个无声循环的MP3文件将有助于实现你的目标.
| 归档时间: |
|
| 查看次数: |
4579 次 |
| 最近记录: |