访问Swift,iOS中下载的视频文件

时间:2017-07-10 14:09:00

标签: ios swift

我正在尝试制作一款允许用户下载视频以进行离线播放的应用,例如下载一些视频以便在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 = ""

所以,我的问题是:

  1. 我可以设法下载文件,找到下载的文件并将其路径保存到CoreData以保持持久性。我可以使用上面的代码从本地文件播放本地视频,但是当我重新启动模拟器时,我无法再访问该文件。我需要再次下载,这是我要避免的事情。这可能是什么原因?

  2. 我希望在不使用CoreData的情况下执行此操作,因为它是关于文件处理的。但我没有足够的资源来学习Filemanager。我只是想保护我的视频(我不希望该用户同步它们),我希望我的用户可以根据需要进行离线访问,但我不想将视频包含在Bundle中。最好的方法是什么?

  3. 提前感谢您的帮助!

0 个答案:

没有答案