Ios Swift文件下载问题

Ios Swift文件下载问题,ios,swift,Ios,Swift,我正在尝试从远程位置下载plist文件,并在我正在创建的iOS应用程序中使用它。该文件将用于应用程序日历中的日历详细信息。很明显,我的目标是更新远程文件,而不是每次需要更改日历详细信息时都要将更新推送到应用程序本身 我从本例中使用的代码开始: 这是我的修改版本: // Create destination URL let documentsUrl:URL = FileManager.default.urls(for: .documentDirectory, in: .userDomai

我正在尝试从远程位置下载plist文件,并在我正在创建的iOS应用程序中使用它。该文件将用于应用程序日历中的日历详细信息。很明显,我的目标是更新远程文件,而不是每次需要更改日历详细信息时都要将更新推送到应用程序本身

我从本例中使用的代码开始:

这是我的修改版本:

// Create destination URL
    let documentsUrl:URL =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL!
    let destinationFileUrl = documentsUrl.appendingPathComponent("2017.plist")
    //let destinationFileUrl = URL(string: Bundle.main.path(forResource: String(currentYear), ofType: "plist")!)


    //Create URL to the source file you want to download
    let fileURL = URL(string: "https://drive.google.com/open?id=0BwHDQFwaL9DuLThNYWwtQ1VXblk")

    let sessionConfig = URLSessionConfiguration.default
    let session = URLSession(configuration: sessionConfig)

    let request = URLRequest(url:fileURL!)

    let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in
        if let tempLocalUrl = tempLocalUrl, error == nil {
            // Success
            if let statusCode = (response as? HTTPURLResponse)?.statusCode {
                print("Successfully downloaded. Status code: \(statusCode)")

            }

            do {

                try FileManager.default.removeItem(at: destinationFileUrl)
                try FileManager.default.moveItem(at: tempLocalUrl, to: destinationFileUrl)
                print("File was replaced")
                print(NSArray(contentsOf: tempLocalUrl))
                //print(tempLocalUrl)
            } catch (let writeError) {
                print("Error creating a file \(String(describing: destinationFileUrl)) : \(writeError)")
            }

        } else {
            print("Error took place while downloading a file. Error description: %@", error?.localizedDescription as Any);
        }
    }
    task.resume()
我最初试图覆盖与应用捆绑在一起的文件,结果导致错误。因此,我尝试将其保存在应用程序的documents文件夹中,从而消除了该错误。我必须确保并删除该文件的任何早期版本,因为它在第一次运行后给了我一个文件已经存在的错误

虽然它说一切正常(成功下载和替换文件的输出都会发生),但当我从下载的URL打印数组内容时,它只会给我
nil

这是我第一次尝试在应用程序中使用任何类型的外部资源。以前,我总是把所有的事情都放在内部,所以我确信我遗漏了一些显而易见的东西

更新1: 我意识到我没有从谷歌硬盘下载文件的正确URL。该行代码已更改为:

let fileURL = URL(string: "https://drive.google.com/uc?export=download&id=0BwHDQFwaL9DuLThNYWwtQ1VXblk")
所以现在我真的下载了plist,就像我原来以为的那样。即使删除了第一条评论中提到的删除问题,我仍然无法让下载的文件实际替换现有的文件

更新2: 我已将实际的文件操作简化为以下内容:

do {


                    try FileManager.default.replaceItemAt(destinationFileUrl, withItemAt: tempLocalUrl)
                    print("File was replaced")
                    print(NSArray(contentsOf: destinationFileUrl))

                } catch (let writeError) {
                    print("Error creating a file \(String(describing: destinationFileUrl)) : \(writeError)")
                }

            } else {
                print("Error took place while downloading a file. Error description: %@", error?.localizedDescription as Any);
            }
执行替换后,文件的输出将显示从internet下载的正确的新内容


稍后在代码中,当我尝试访问该文件时,它的内容似乎再次为零

查看您的下载完成代码。你:

  • 删除目标URL处的文件(如果有) 残羹剩饭)

  • 将临时文件移动到目标URL(从临时文件中删除它 (网址)

  • 尝试从临时URL加载文件。


  • 此图片有什么问题?

    您正在尝试获取移动文件的内容。您已经将文件移动到目标url,然后您正试图从临时位置获取文件的内容

    要获取文件数据,请尝试以下操作:

    let fileData = try! String(contentsOf: destinationFileUrl, encoding: String.Encoding.utf8)
    print(fileData)
    

    正如我所说,我确信存在一些明显的错误。我已经盯着这个代码看了好几个小时了,今天我想尽了一切办法。如果我们忽略了您的建议(这当然是合理的考虑),回到代码的顶部。我在“成功下载”后立即打印出来。文件仍然显示为“nil”,这意味着我甚至没有得到一个文件,或者至少不是我认为我得到的文件。因此,很明显,我还有很多事情要弄清楚,甚至比我最初想象的还要多。想想看。你的代码中有一个非常明显的缺陷。如果你移动一个文件,一旦你移动它,它就不再位于原来的位置。然后您尝试从原始位置加载它,但令人惊讶的是,它不再存在了。