2016-01-21 14 views
5

Buduję aplikację odtwarzacza muzyki i wszystko działa poprawnie. Do tej pory używałem systemowego odtwarzacza muzycznego, ale teraz chcę przełączyć się na używanie odtwarzacza muzyki z aplikacji, i właśnie tam napotykam na problemy - na całe życie nie mogę wymyślić, jak zdobyć mój komputer. odtworzyć/wstrzymać wywołanie zwrotne do wywołania z centrum sterowania iOS. Oto kod używam w moim głównym kontrolerem Widok:Odtwarzanie/wstrzymywanie wywołania zwrotnego nie jest wywoływane podczas używania MPRemoteCommandCenter

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.musicPlayer = MPMusicPlayerController.applicationMusicPlayer() 

    self.registerForMediaPlayerNotifications() 
    UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 

    let commandCenter = MPRemoteCommandCenter.sharedCommandCenter() 

    commandCenter.previousTrackCommand.enabled = false 
    commandCenter.previousTrackCommand.addTarget(self, action: "previousTrack") 
    commandCenter.nextTrackCommand.enabled = false 
    commandCenter.nextTrackCommand.addTarget(self, action: "nextTrack") 
    commandCenter.togglePlayPauseCommand.enabled = true 
    commandCenter.togglePlayPauseCommand.addTarget(self, action: "playOrPauseMusic") 
    commandCenter.pauseCommand.addTarget(self, action: "playOrPauseMusic") 
    commandCenter.pauseCommand.enabled = true 
    commandCenter.playCommand.addTarget(self, action: "playOrPauseMusic") 
    commandCenter.playCommand.enabled = true 

    [...] 
} 


func previousTrack() { 
} 

func nextTrack() { 
} 

func playOrPauseMusic() { 
    print("playOrPause") 
} 
+0

Jedyne, co mogę wymyślić, to to, że obiekt nie istnieje, gdy przychodzi wywołanie zwrotne. Czy gdzieś przechowujesz obiekt? – fishinear

+0

Masz na myśli obiekt commandCenter? Nie, nie przechowuję tego nigdzie, ponieważ zakładałem, że będzie to jakaś globalna współużytkowana instancja, dla której potrzebuję tylko odniesienia do ustawiania celów/włączania/wyłączania itd. Mogę spróbować ale ... – dflachbart

+0

Nie, mam na myśli self, obiekt, który zawiera ten kod. Umieść punkt przerwania w jego 'dealloc', aby zobaczyć, czy zostanie wyczyszczony. – fishinear

Odpowiedz

1

spróbuj dodać Required background modes do Info.plist tak:

Info.plist screenshot

+0

Tak, już próbowałem, nie miało to znaczenia ... – dflachbart

-3

zamieść kod w viewDidApper.

+0

, które nie działało dla mnie. To zadziałało dla ciebie? – evenodd

3

Miałem ten sam problem i zauważyłem, że wywołanie zwrotne dla togglePlayPauseCommand nie zostało wywołane, ale było previousTrackCommand. Po przeprowadzeniu niektórych eksperymentów udało mi się to zrobić, usuwając togglePlayPauseCommand i zamiast tego, wykonując indywidualne wywołania zwrotne dla playCommand i pauseCommand - należy pamiętać, że używanie niestandardowych selektorów nie działa, muszą to być wywołania zwrotne wbudowane.

let commandCenter = MPRemoteCommandCenter.shared() 

commandCenter.playCommand.addTarget { (commandEvent) -> MPRemoteCommandHandlerStatus in 
    moviePlayer.prepareToPlay() 
    moviePlayer.play() 
    return MPRemoteCommandHandlerStatus.success 
} 

commandCenter.pauseCommand.addTarget { (commandEvent) -> MPRemoteCommandHandlerStatus in 
    moviePlayer.pause() 
    return MPRemoteCommandHandlerStatus.success 
}