iOS 4:背景音频的遥控器

Ans*_*ala 31 iphone audio avfoundation ios4

我正在尝试为我正在为iOS 4开发的应用程序设置背景音频.该应用程序没有专用的音乐播放器viewController,但不像其他背景音频应用程序,如Pandora,这使任务更多一点混乱.

我已Info.plist正确设置了适当的设置,并AVAudioPlayer在我的应用委托中有一个对象,可以从任何地方访问.当用户播放一首歌曲时,我用一首AVAudioPlayer用歌曲初始化的新歌曲替换它并播放它.这一切都很好,除了现在我不知道如何支持远程控制事件.

根据Apple的文档,我有这个:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
    [self resignFirstResponder];
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
    switch(event.subtype) {
        case UIEventSubtypeRemoteControlTogglePlayPause:
            if([iPhoneAppDelegate backgroundAudioPlayer].playing)
                [iPhoneAppDelegate pauseBackgroundAudioPlayer];
            else
                [iPhoneAppDelegate playBackgroundAudioPlayer];
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,我在哪里放这个?Apple的文档似乎暗示这应该放在某个视图控制器的某个地方,但我的应用程序有很多视图控制器和导航控制器.无论我试图把它放在哪里,出于某种原因,在多任务托盘遥控器中点击切换播放/暂停按钮会导致歌曲暂停片刻然后取消暂停,或以某种方式使歌曲播放两次.

小智 37

文档示例有点误导,但不需要在任何地方子类化.放置remoteControlReceivedWithEvent:的正确位置在应用程序委托中,因为它保留在响应程序链中,无论应用程序是否在前台.此外,开始/结束接收远程控制事件应基于您是否确实需要事件,而不是基于某些随机视图的可见性.

  • 完全正确.要完全控制应用程序的远程控制(无论是在前台还是后台),您需要在应用程序中调用beginReceivingRemoteControlEvents:didFinishLaunchingWithOptions:,但这不是全部.在您的应用告诉iOS它正在播放音轨后,您的UIApplicationDelegate会开始接收远程控制事件 - 通过设置MPNowPlayingInfoCenter nowPlayingInfo属性. (11认同)

Ans*_*ala 19

经过一些搜索后,我找到了几个在Apple Developer论坛上接收全局远程控制事件的解决方案.

一种方法是子类化UIWindow并覆盖它remoteControlReceivedWithEvent:.

第二种,也许更好的方法是子类化UIApplication和覆盖sendEvent:.这样,您可以拦截所有远程控制事件并在全局处理它们,并且以后没有任何其他响应程序在响应程序链中处理它们.

- (void)sendEvent:(UIEvent *)event {
     if (event.type == UIEventTypeRemoteControl) {
          // Handle event
     }
     else
          [super sendEvent:event];
}
Run Code Online (Sandbox Code Playgroud)

  • 请参阅我对Brian Dam Pedersen的回答 (2认同)