从iOS锁定屏幕进行远程控制,我应该在哪里检查事件?

时间:2015-09-27 17:12:41

标签: ios audio-player

我是iOS / swift编程的新手,我正在开发一个由别人开发的应用程序,修复一些错误。

该应用程序本质上是一个音乐播放器,音乐也必须在后台播放,可以从锁定屏幕播放/暂停/跳过。该应用程序有几个视图,其中一个是主视图,包含与播放器本身相关的所有代码(player.swift),其他视图包含其他附加页面/功能。

来自锁定屏幕的命令仅在我从主视图开始锁定屏幕时起作用,如果我从另一个视图开始执行(例如帮助视图,这只是帮助视图,当帮助时显示在播放器上方链接被点击)他们不工作。在这里阅读几篇文章我已经意识到原因是相关的代码在player.swift中:

override func remoteControlReceivedWithEvent(event: UIEvent) {
    if (event.type == UIEventType.RemoteControl) {
        switch (event.subtype) {
        case UIEventSubtype.RemoteControlPlay:
            self.onPlayPause(self);
        case UIEventSubtype.RemoteControlPause:
            self.onPlayPause(self);
        case UIEventSubtype.RemoteControlTogglePlayPause:
            self.onPlayPause(self);
        case UIEventSubtype.RemoteControlNextTrack:
            onNext(nil)
        default:
            break
        }
    }

}

所以我已经理解了这个问题,但即使我已经阅读了几篇相关文章(包括remoteControlReceivedWithEvent called on iOS 7.0 device but not iOS 8.0Using lock screen for my app?Swift. Receive remote control events to work with MPNowPLayingInfoCenter),我也无法弄清楚我需要在哪里移动此代码,如果我需要移动其他内容或进行修改。

EDIT。我按照建议移动AppDelegate.swift中的代码(删除player.swift中的代码)。即使我从不同于player.swift的视图中锁定设备,它现在似乎也会拦截命令。不过我有两个问题:

1)它似乎只运行一次,如果我从锁定屏幕点击“下一步”,我可以从调试字符串中看到命令被截获,如果我第二次没有发生任何事情

2)我需要从AppDelegate.swift调用player.swift中的方法(onPlayPause和onNext),我猜这些方法期望设置一个玩家对象和/或它们引用在player.swift和I中声明的变量不知道如何处理这个问题。例如,onNext方法声明为

 @IBAction func onNext(sender: AnyObject?) {
    oldImage = iAlbumArt.image
.......

如果我将该方法作为AppDelegate的新实例调用

player().onNext(nil)

我收到错误,因为iAlbumArt.image是NIL。 iAlbumArt是在Player类中声明为

的变量
 @IBOutlet weak var iAlbumArt: UIImageView!

对于天真的问题感到抱歉,但几周前我一直在研究iOS开发。

1 个答案:

答案 0 :(得分:0)

尝试将其添加到App Delegate类。

编辑:

要将远程控制事件转发到视图控制器,请将此代码添加到应用程序委托(假设您的播放器视图控制器被调用PlayerViewController):

let vcs = (self.window!.rootViewController as! UINavigationController).viewControllers
let indexOfPlayer = (vcs as! NSArray).indexOfObjectPassingTest { (vc, idx, stop) in
    return (vc.isKindOfClass(PlayerViewController))
}
let playerVC = vcs[indexOfPlayer];

编辑2:

  1. override func remoteControlReceivedWithEvent方法放入App Delegate Class。
  2. 在该方法的顶部,放置上面显示的代码段。
  3. 在该方法中,将self替换为playerVC
  4. 在播放器视图控制器中,添加代码以响应onPlayPauseonNext功能。
  5. 注意:的 这段代码的原因是:

    player().onNext(nil)
    

    抛出错误是因为player()创建了一个全新的玩家类实例。您希望使用现有实例,以便更改反映在屏幕上。