当按下Swift 2中UINavigation控制器上的"后退"按钮时,让AVPlayer继续播放

Mel*_*or 2 iphone ios avplayer swift2

我正在开发一个Radio Streaming应用程序,它可以流畅播放.当按下"主页"按钮和"锁定"按钮时,它也会在后台播放.

应用程序嵌入到a中UINavigationController,当我按下UINavigationController中的"后退"按钮时,它停止播放.我的问题是:当按下导航控制器中的"后退"按钮以便继续流式传输时UIViewController,如何让包含它的内容AVPlayer保持活动状态AVPlayer

我的代码

import UIKit
import AVFoundation
import MediaPlayer
import Foundation

class RadioFunctionViewController: UIViewController {

@IBOutlet var playButton: UIButton!
@IBOutlet var statusLabel: UILabel!
var player:AVPlayer = AVPlayer()
private let ObservatingKeyPath = "currentItem.status"
private let PlayerStatusObservingContext = UnsafeMutablePointer<Int>(bitPattern: 1)
private var playingState:Bool = false


override func viewDidLoad() {
    super.viewDidLoad()

    setStatus(4)
    getAudioData("http://184.107.179.162:7546/;")
    playingState = true


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBAction func buttonPressed(sender: AnyObject)
{
    toggle()
}

func getAudioData(audioURL:String)
{
    player = AVPlayer(URL: NSURL(string: audioURL)!)
    player.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.Initial, context: nil)
}

func setStatus(rawValue:Int)
{
    if rawValue == 1
    {
        statusLabel.textColor = UIColor.blueColor()
        statusLabel.text = "Ready for Streaming"
    }else if rawValue == 2
    {
        statusLabel.textColor = UIColor.redColor()
        statusLabel.text = "Failed"

    }else if rawValue == 0
    {
        statusLabel.textColor = UIColor.redColor()
        statusLabel.text = "Failed to load data"
    }else if rawValue == 3
    {
        statusLabel.textColor = UIColor.blueColor()
        statusLabel.text = "Streaming"
    }else if rawValue == 4
    {
        statusLabel.textColor = UIColor.purpleColor()
        statusLabel.text = "Gather data..."
    }
    print("The raw value send is: \(rawValue)")
}

func audioBackgroundPlayback()
{
    do{
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    }catch {
        print("Could not play audio in the background")
    }

    if (NSClassFromString("MPNowPlayingInfoCenter") != nil)
    {
        let artWorkImage = MPMediaItemArtwork(image: UIImage(named: "ws")!)
        let songInfo2: [String:  AnyObject] = [MPMediaItemPropertyTitle: "Wide Streamings ABC Edition", MPMediaItemPropertyArtist: "Rumbera Network", MPMediaItemPropertyAlbumTitle: "107.9 FM", MPMediaItemPropertyArtwork: artWorkImage]

        MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = songInfo2
        UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
    }


}

func toggle()
{
    if playButton.titleLabel?.text == "Play"
    {
        print("The play option is chosen")
        playRadio()
    }else{
        print("The pause option is chosen")
        pauseRadio()
    }
}

func playRadio()
{
    player.play()
    setStatus(3)
    playButton.setTitle("Pause", forState: UIControlState.Normal)
    audioBackgroundPlayback()
}

func pauseRadio()
{
    player.pause()
    playButton.setTitle("Play", forState: UIControlState.Normal)
}

override func remoteControlReceivedWithEvent(event: UIEvent?) {
    if event?.type == UIEventType.RemoteControl
    {
        if event?.subtype == UIEventSubtype.RemoteControlPlay
        {
            toggle()
        }else if event?.subtype == UIEventSubtype.RemoteControlPause
        {
            pauseRadio()
        }else if event?.subtype == UIEventSubtype.RemoteControlTogglePlayPause
        {
            toggle()
        }
    }
}

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>)
{
    if (keyPath!.containsString("status"))
    {
        if player.status == AVPlayerStatus.ReadyToPlay
        {
            player.prerollAtRate(0.001, completionHandler: {(succes:Bool)-> Void in

                if succes{
                    self.setStatus(1)
                    self.setStatus(3)
                    self.playRadio()

                }else{
                    self.setStatus(1)
                    self.setStatus(2)
                }

            })
        }else if player.status == AVPlayerStatus.Failed{
            self.setStatus(2)

        }else if player.status == AVPlayerStatus.Unknown
        {
            self.setStatus(0)
        }

    }
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    self.navigationController?.navigationBarHidden = false
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.navigationBarHidden = false
    if playingState == true
    {
        audioBackgroundPlayback()
        player.removeObserver(self, forKeyPath: "status")
        print("The AVPlayer is playing in background")
    }else{
        player.removeObserver(self, forKeyPath: "status")
        print("The view Dissapear")
    }


}
Run Code Online (Sandbox Code Playgroud)

希望有人可以帮我解决这个问题

Abh*_*nav 5

AVPlayer只要它是活跃的,它将继续工作.一旦UIViewController通过弹出释放引用AVPlayer也将从内存中丢弃.

我建议你创建一个单例播放器类并创建API来启动/停止/播放/暂停AVPlayer.现在,您可以在应用中的任何位置全局访问它.

编辑:为方便起见(开始的样本):

class MyAVPlayer {
    static let sharedInstance = MyAVPlayer()

    var player:AVPlayer = AVPlayer()

    func play() {
        // Put play code here
    }

    func playWithURL(url : NSURL) {
        // Put play code here
    }
}
Run Code Online (Sandbox Code Playgroud)

称之为(从您的应用程序的任何地方):

MyAVPlayer.sharedInstance.playWithURL(myURL)
Run Code Online (Sandbox Code Playgroud)