it-swarm.com.de

Wie bekomme ich Audio-Steuerelemente von AVAudioPlayer in Swift auf Sperrbildschirm/Control Center?

Neu bei der iOS-Entwicklung, also hier. Ich habe eine App, die Audio abspielt. Ich benutze AVAudioPlayer, um einzelne Dateien nach Namen in die Assets der App zu laden. Ich möchte nicht die Bibliothek des Benutzers abfragen, sondern nur die bereitgestellten Dateien. Funktioniert großartig, aber ich möchte, dass der Benutzer in der Lage ist, die Lautstärke über den Sperrbildschirm einzustellen und einzustellen.

func initAudioPlayer(file:String, type:String){
    let path = NSBundle.mainBundle().pathForResource(file, ofType: type)!
    let url = NSURL(fileURLWithPath: path)
    let audioShouldPlay = audioPlaying()
    do{
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)
        let audioPlayer:AVAudioPlayer = try AVAudioPlayer(contentsOfURL: url)
        audioPlayer.volume = slider.value
        audioPlayer.numberOfLoops = -1
        audioPlayer.prepareToPlay()
        if(audioShouldPlay){
            audioPlayer.play()
//                let mpic = MPNowPlayingInfoCenter.defaultCenter()
//                mpic.nowPlayingInfo = [MPMediaItemPropertyTitle:"title", MPMediaItemPropertyArtist:"artist"]
        }
    }
    catch{}
}

Meine Verwendung von AVAudioSession und MPNowPlayingInfoCenter war nur ein Experiment durch das Lesen anderer verwandter Beiträge.

Der Hintergrundmodus ist für Audio in der Plist-Datei meiner App aktiviert

15
nbpeth

Sie müssen beginReceivingRemoteControlEvents () aufrufen, da es sonst auf dem tatsächlichen Gerät nicht funktioniert.

Swift 3.1

UIApplication.shared.beginReceivingRemoteControlEvents()

Wenn Sie benutzerdefinierte Aktionen für das MPRemoteCommandCenter angeben möchten:

let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.nextTrackCommand.isEnabled = true
commandCenter.nextTrackCommand.addTarget(self, action:#selector(nextTrackCommandSelector))
24
Leo Dabus
func myplayer(file:String, type:String){
let path = NSBundle.mainBundle().pathForResource(file, ofType: type)!
let url = NSURL(fileURLWithPath: path)
let audioShouldPlay = audioPlaying()
do{
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    try AVAudioSession.sharedInstance().setActive(true)
    let audioPlayer:AVAudioPlayer = try AVAudioPlayer(contentsOfURL: url)
    audioPlayer.volume = slider.value
    audioPlayer.numberOfLoops = -1
    audioPlayer.prepareToPlay()
    if(audioShouldPlay){
        audioPlayer.play()
//                let mpic = MPNowPlayingInfoCenter.defaultCenter()
//                mpic.nowPlayingInfo = [MPMediaItemPropertyTitle:"title", 
MPMediaItemPropertyArtist:"artist"]
        }
    }
    catch{}
}
3
user6812502

Auf dem Sperrbildschirm (der "Fernbedienung" -Schnittstelle) befinden sich bereits Audiokontrollen. Wenn Sie möchten, dass sie das Audio Ihrer App steuern, müssen Sie Ihre App als Remote Control Target festlegen, wie in Apple-Dokumentation beschrieben.

3
matt

Ich habe dieses Problem. Du brauchst nur 

audioSession.setCategory(.playback, mode: .default) or 
audioSession.setCategory(.playback, mode: .default, options: 
                                               .init(rawValue: 0)) 

Verwenden Sie zur Implementierung dieser Funktionalität die Klassen MPRemoteCommandCenter und MPNowPlayingInfoCenter des Media Player-Frameworks mit AVPlayer .

import MediaPlayer
import AVFoundation

// Configure AVPlayer
var player = AVPlayer()

Konfigurieren Sie die Remote Command Handler

Definiert eine Vielzahl von Befehlen in Form von MPRemoteCommand-Objekten, an die Sie benutzerdefinierte Ereignishandler anfügen können, um die Wiedergabe in Ihrer App zu steuern.

    func setupRemoteTransportControls() {
    // Get the shared MPRemoteCommandCenter
    let commandCenter = MPRemoteCommandCenter.shared()

    // Add handler for Play Command
    commandCenter.playCommand.addTarget { [unowned self] event in
        if self.player.rate == 0.0 {
            self.player.play()
            return .success
        }
        return .commandFailed
    }

    // Add handler for Pause Command
    commandCenter.pauseCommand.addTarget { [unowned self] event in
        if self.player.rate == 1.0 {
            self.player.pause()
            return .success
        }
        return .commandFailed
    }
}

Anzeige-Metadaten bereitstellen

Stellen Sie ein Metadatenwörterbuch mit den Schlüsseln bereit, die von MPMediaItem und MPNowPlayingInfoCenter definiert wurden, und legen Sie dieses Wörterbuch in der Standardinstanz von MPNowPlayingInfoCenter fest.

func setupNowPlaying() {
    // Define Now Playing Info
    var nowPlayingInfo = [String : Any]()
    nowPlayingInfo[MPMediaItemPropertyTitle] = "My Movie"

    if let image = UIImage(named: "lockscreen") {
        nowPlayingInfo[MPMediaItemPropertyArtwork] =
            MPMediaItemArtwork(boundsSize: image.size) { size in
                return image
        }
    }
    nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = playerItem.currentTime().seconds
    nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = playerItem.asset.duration.seconds
    nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate

    // Set the metadata
    MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}

Weitere Informationen finden Sie unter Apples official Documentation

1
Sreekuttan