问题
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