我正在尝试制作一款允许用户下载视频以进行离线播放的应用,例如下载一些视频以便在Netflix中进行离线观看。
我使用Firebase作为视频的服务器。以下是下载按钮的操作:
@IBAction func btnDL(_ sender: Any) {
self.dlBtnOutlet.isEnabled = false
//Firebase
let storage = Storage.storage()
let videoRef = storage.reference(forURL: "gs://videowcoredata.appspot.com/Some video file.mp4")
//Local file system
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let localURL = documentsURL.appendingPathComponent("movie.mp4")
// Download to the local filesystem
let downloadTask = videoRef.write(toFile: localURL) { (URL, error) -> Void in
if (error != nil) {
print("Uh-oh, an error occurred!")
print(error)
} else {
print("Local file URL is returned")
self.genericURL = String(localURL.path)
print(localURL.path)
//Save the link to CoreData
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let myUrl = MyFiles(context: context)
myUrl.fileURL = self.genericURL
(UIApplication.shared.delegate as! AppDelegate).saveContext()
我正在使用CoreData只是为了下载文件链接的持久性。保存指向数组的链接,并将该数组的最后一个成员作为下载的链接返回。我正在尝试在新的AVPlayerViewController中播放该文件,并准备了segue。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Fetch CoreData
let destination = segue.destination as! AVPlayerViewController
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
do {
urlList = try context.fetch(MyFiles.fetchRequest())
}
catch {
print("Oops we have an error!)")
}
self.genericURL = (urlList.last?.fileURL)!
destination.player = AVPlayer(url: URL(fileURLWithPath: self.genericURL))
}
我在代码的开头定义了两个变量以便以后访问:
var urlList : [MyFiles] = []
var genericURL = ""
所以,我的问题是:
我可以设法下载文件,找到下载的文件并将其路径保存到CoreData以保持持久性。我可以使用上面的代码从本地文件播放本地视频,但是当我重新启动模拟器时,我无法再访问该文件。我需要再次下载,这是我要避免的事情。这可能是什么原因?
我希望在不使用CoreData的情况下执行此操作,因为它是关于文件处理的。但我没有足够的资源来学习Filemanager。我只是想保护我的视频(我不希望该用户同步它们),我希望我的用户可以根据需要进行离线访问,但我不想将视频包含在Bundle中。最好的方法是什么?
提前感谢您的帮助!