Should I be using AVKit Player view?

こ雲淡風輕ζ 提交于 2019-12-11 19:33:22

问题


So my app has gone from being a single view to being a navigation controller view + tab bar controller view.

Now in my single app view controller I had all this code.

//
//  ViewController.swift
//  DRN1
//
//  Created by Russell Harrower on 24/11/19.
//  Copyright © 2019 Russell Harrower. All rights reserved.
//

import UIKit
import AVKit
import AVFoundation
import Kingfisher

extension UIImageView {
      func setImage(with urlString: String){
          guard let url = URL.init(string: urlString) else {
              return
          }
          let resource = ImageResource(downloadURL: url, cacheKey: urlString)
          var kf = self.kf
          kf.indicatorType = .activity
          self.kf.setImage(with: resource)
      }
  }
struct Nowplayng: Decodable{
    let data: [Data]
}

struct Data: Decodable{
    let track: Trackinfo
}
struct Trackinfo: Decodable {
    let title: String
    let artist: String
    let imageurl: String
}

class FirstViewController: UIViewController {

    var timer = Timer()
    var playButton = true;
    var player = AVPlayer()

    @IBOutlet weak var artist: UILabel!
    @IBOutlet weak var song: UILabel!
    @IBOutlet weak var imageurl: UIImageView!

    override var prefersStatusBarHidden: Bool {
        return true
    }

      override func viewDidLoad() {
          super.viewDidLoad()
                 guard let url = URL(string: "http://stream.radiomedia.com.au:8003/stream") else {
                   return
                 }
                 // Create a new AVPlayer and associate it with the player view
                 self.player = AVPlayer(url: url)
                 player.allowsExternalPlayback = true
                 player.usesExternalPlaybackWhileExternalScreenIsActive = true
                 // Create a new AVPlayerViewController and pass it a reference to the player.
                 let playerViewController = AVPlayerViewController()
                 playerViewController.contentOverlayView?.backgroundColor = UIColor.white
                 playerViewController.view.frame = CGRect (x:100, y:100, width:0, height:0)
                 playerViewController.player = player

                 self.addChild(playerViewController)
                 self.view.addSubview(playerViewController.view)
                 playerViewController.didMove(toParent: self)
                 playerViewController.player = player
                 player.play()

          // Do any additional setup after loading the view.
          self.artist.textAlignment = .center
          self.song.textAlignment = .center
          scheduledTimerWithTimeInterval()
          self.nowplaying()



      }

    func scheduledTimerWithTimeInterval(){
        // Scheduling timer to Call the function "updateCounting" with the interval of 1 seconds
        timer = Timer.scheduledTimer(timeInterval: 30, target: self, selector: #selector(self.nowplaying), userInfo: nil, repeats: true)
    }


     @objc func nowplaying(){
          let jsonURLString = "https://api.drn1.com.au/station/playing"
                  guard let feedurl = URL(string: jsonURLString) else { return }

                  URLSession.shared.dataTask(with: feedurl) { (data,response,err)
                      in

                      guard let data = data else { return }

                      do{
                          let nowplaying = try JSONDecoder().decode(Nowplayng.self, from: data)

                          nowplaying.data.forEach {

                              DispatchQueue.main.async {
                              self.artist.text = nowplaying.data.first?.track.artist
                              self.song.text = nowplaying.data.first?.track.title
                              }

                              print($0.track.title)

                              if var strUrl = nowplaying.data.first?.track.imageurl {

                                  strUrl = strUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
                                  self.imageurl.kf.setImage(with: URL(string: strUrl), placeholder: nil)

                              }
                              //self.imageurl.setImage(with: $0.track.imageurl)

                         }



                      }catch let jsonErr{
                      print("error json ", jsonErr)
                      }


                  }.resume()
      }


      override func viewDidAppear(_ animated: Bool) {

      }

      @IBAction func playVideo(_ sender: Any) {

          if(playButton == false){
              playButton = true;
          (sender as! UIButton).setTitle("Pause", for: [])
              self.player.play()

          }else
          {
              playButton = false;
          (sender as! UIButton).setTitle("Play", for: [])
               self.player.pause()
          }

      }

}

Which has now ended app in firstViewController.swift, However it seems while yes the music plays it seems to stop or end when a user navigates off it, instead of playing in the background.

So do I need to include a AVkit Player View in my storyboard as well to get this to function correctly - thinking about it it would make more sense however never used it before and would really like some advice.

来源:https://stackoverflow.com/questions/59014737/should-i-be-using-avkit-player-view

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!