2016-01-21 15 views
5

Sto costruendo un'app di lettore musicale e tutto funziona correttamente. Finora ho usato il riproduttore musicale di sistema, ma ora voglio passare a utilizzare un lettore musicale per applicazioni, ed è lì che mi imbatto in problemi - per la vita di me non riesco a capire come ottenere il mio play/pause callback da chiamare dal centro di controllo iOS. Ecco il codice che sto utilizzando nel mio controller vista principale:Riproduzione/Pausa La richiamata non viene chiamata quando si utilizza 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

L'unica cosa che posso pensare è che il tuo oggetto non esiste più quando arriva la richiamata. Conservi l'oggetto da qualche parte? – fishinear

+0

Intendi l'oggetto commandCenter? No, non lo sto memorizzando da nessuna parte, perché ho pensato che sarebbe stata un'istanza globale condivisa per la quale ho solo bisogno del riferimento per impostare obiettivi/abilitare/disabilitare ecc. Posso provarlo però ... – dflachbart

+0

No, intendo auto, l'oggetto che contiene questo codice. Metti un breakpoint nel suo 'dealloc' per vedere se viene pulito. – fishinear

risposta

1

Prova ad aggiungere Required background modes al Info.plist in questo modo:

Info.plist screenshot

+0

Sì, l'ho già provato, non ha fatto la differenza ... – dflachbart

-3

posto il codice in viewDidApper.

+0

che non ha funzionato per me. Ha funzionato per te? – evenodd

3

Ho avuto questo stesso problema e ho notato che il callback per togglePlayPauseCommand non è stato chiamato, ma è stato previousTrackCommand. Quindi, dopo alcuni esperimenti, ho risolto questo problema rimuovendo togglePlayPauseCommand e implementando, in modo indipendente, i callback inline per playCommand e pauseCommand. Si noti che l'utilizzo di selettori personalizzati non funzionava, dovevano essere i callback in linea.

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 
}