2016-01-21 13 views
5

Ich baue eine Musik-Player-App, und alles funktioniert gut. Ich habe den System-Musik-Player bisher benutzt, möchte aber jetzt stattdessen einen Anwendungs-Music-Player verwenden, und da stolpert es um Probleme - für mein Leben kann ich nicht herausfinden, wie ich mein Gerät bekomme play/pause Callback, um von der iOS-Zentrale aus angerufen zu werden. Hier ist der Code, den ich in meinem Haupt-View-Controller verwenden bin:Play/Pause Callback wird nicht aufgerufen, wenn MPRemoteCommandCenter verwendet

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

Das einzige, was mir einfällt, ist, dass Ihr Objekt nicht mehr existiert, wenn der Rückruf kommt. Speichern Sie das Objekt irgendwo? – fishinear

+0

Sie meinen das CommandCenter-Objekt? Nein, ich speichere das nicht irgendwo, da ich annahm, dass es eine globale geteilte Instanz sein würde, für die ich nur die Referenz brauche, um Ziele zu setzen/aktivieren/deaktivieren usw. Ich kann es versuchen ... – dflachbart

+0

Nein, meine ich Selbst, das Objekt, das diesen Code enthält. Setzen Sie einen Haltepunkt in sein 'dealloc', um zu sehen, ob es bereinigt wird. – fishinear

Antwort

1

Versuchen Hinzufügen Required background modes zum Info.plist wie folgt aus:

Info.plist screenshot

+0

Ja, ich habe das schon versucht, machte keinen Unterschied ... – dflachbart

-3

Ort, um Ihren Code in viewDidApper.

+0

das hat nicht für mich funktioniert. Es hat für dich funktioniert? – evenodd

3

Ich hatte das gleiche Problem und bemerkte, dass der Rückruf für togglePlayPauseCommand wurde nicht aufgerufen, aber previousTrackCommand war. Also nach ein paar Experimenten habe ich das funktioniert durch Entfernen togglePlayPauseCommand und stattdessen indiviudally die Inline-Callbacks für playCommand und pauseCommand implementieren - bitte beachten Sie, dass die Verwendung von benutzerdefinierten Selektoren nicht funktionierten, mussten sie die Inline-Callbacks sein.

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 
} 
Verwandte Themen