Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 接收无音频的远程控制事件_Objective C_Ios_Ios5_Avaudiosession_Remote Control - Fatal编程技术网

Objective c 接收无音频的远程控制事件

Objective c 接收无音频的远程控制事件,objective-c,ios,ios5,avaudiosession,remote-control,Objective C,Ios,Ios5,Avaudiosession,Remote Control,以下是一些背景信息,否则请跳到问题的前面。我正在构建一个应用程序,我希望它能够访问遥控器/锁屏事件。棘手的是,这个应用程序本身不播放音频,它控制附近另一台设备的音频。当应用程序位于前台时,设备之间的通信不是问题。正如我刚刚发现的,一个应用程序在播放音频会话之前不会控制遥控器,并且是最后一个这样做的应用程序。这带来了一个问题,因为正如我所说,该应用程序控制另一台设备的音频,不需要播放自己的音频 我的第一个倾向是让应用程序在每次打开时播放一段无声片段,以便控制遥控器。我必须这样做的事实让我怀疑,苹果

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

我的第一个倾向是让应用程序在每次打开时播放一段无声片段,以便控制遥控器。我必须这样做的事实让我怀疑,苹果是否会允许我这样做,或者是否有其他方法来实现这一点,而不必用假音频剪辑愚弄系统


问题:苹果会批准一款播放无声音频片段的应用程序,以控制远程/锁屏控制,从而控制其他设备的音频吗?有没有办法在没有音频会话的情况下控制遥控器?

另外,我更希望在iOS 4.0及更高版本上使用此功能

p.p.S我已经看过了,这让我头脑风暴,但提供的答案并不具体到我需要知道的内容。


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

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

我保留了这篇文章的其余部分作为历史参考,但以下内容不保证在最新的iOS版本上有效。事实上,它可能不会


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

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

我做了一个演示如何做这件事

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

  • 您需要创建
    UIApplication
    的子类。当文档中提到
    UIResponder
    时,它的意思是
    UIApplication
    ,因为您的应用程序类是
    UIResponder
    的子类。在这个子类中,您将实现
    remoteControlReceivedWithEvent:
    可以成为第一响应者
    方法。您想从
    返回
    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
    是我的自定义类的名称。改用子类的名称。不要忘记导入相应的标题

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

  • 玩点什么。在你这么做之前,遥控器将忽略你的应用程序。我只是拿了一个
    AVPlayer
    ,给了它一个我希望能打开的流媒体网站的URL。如果你发现它失败了,把你自己的URL放进去,尽情地玩它

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


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

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

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

    哇,谢谢!我回家后会去看演示。现在你说这里的方法在iOS 6和iOS 7中有效;你知道它会不会回到5.1版本吗?我不确定,但我认为最重要的变化是在iOS 6和iOS 7之间,所以我可以想象它可以在iOS 5上运行。我刚刚给运行iOS 5的iPad充电,并尝试在上面运行演示。起初它不起作用,但如果你关闭自动布局和iOS 6+本地化功能(并将未本地化的nib复制回来),它大部分都能起作用。我这么说主要是因为播放/暂停按钮有问题。(我认为这只是一个我没有正确解释的事件类型。运行它,你就会明白我的意思。)你是个天才,这正是我想要的!还有一个问题-为了让我的应用程序接收遥控事件,它必须是最后一个播放任何类型音频的应用程序。这是正确的吗?在这里尝试了许多其他的解决方案,这是唯一一个真正让我了解事件的解决方案,最后,谢谢!!!!你找到解决办法了吗?苹果会批准在智能电视/流媒体盒上播放无声音频片段以控制播放视频的应用程序吗?还有,你知道Spotify、Sonos和Youtube是如何实现的吗?苹果会批准一款播放si的应用程序吗