簡體   English   中英

通過iOS中的鎖屏進行遠程控制,我應該在哪里檢查事件?

[英]Remote control from lock screen in iOS, where should I check for the events?

我是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
        }
    }

}

因此,我已經理解了這個問題,但是即使我已經閱讀了幾篇相關文章(包括在iOS 7.0設備上調用的remoteControlReceivedWithEvent但在iOS 8.0上未調用為我的應用使用鎖定屏幕?Swift。接收與MPNowPLayingInfoCenter一起使用的遠程控制事件 )無法弄清楚該代碼應移至何處以及是否需要移至其他地方或進行修改。

編輯。 按照建議,我將代碼移至AppDelegate.swift中(刪除了player.swift中的代碼)。 即使我從不同於player.swift的視圖鎖定設備,也似乎現在可以攔截命令。 不過,我有兩個問題:

1)似乎只工作一次,如果我從鎖定屏幕上單擊“下一步”,則可以從調試字符串中看到命令被攔截,如果第二次沒有任何反應,

2)我需要從AppDelegate.swift中調用player.swift中的方法(onPlayPause和onNext),我猜那些方法期望設置一個播放器對象和/或它們引用在player.swift中聲明的變量,但我沒有知道如何處理。 例如,onNext方法聲明為

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

如果我從AppDelegate將該方法作為新實例調用

player().onNext(nil)

我收到錯誤消息,因為iAlbumArt.image為NIL。 iAlbumArt是在Player類中聲明為的變量

 @IBOutlet weak var iAlbumArt: UIImageView!

抱歉,您還沒有提出幼稚的問題,但自幾周前以來,我一直在研究iOS開發。

嘗試將其添加到您的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類中。
  2. 在該方法的頂部,放置上面顯示的代碼段。
  3. 在該方法中,將self替換為playerVC
  4. 在播放器視圖控制器中,添加代碼以響應onPlayPauseonNext函數。

注意:這段代碼的原因:

player().onNext(nil)

引發錯誤是因為player()創建了播放器類的全新實例。 您想使用現有實例,以便更改顯示在屏幕上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM