2

我正在构建一个应用程序,它将其文件保存到用户的 iCloud Drive 文件夹中。一切都很好,直到我删除了 iCloud Drive 中的应用程序文件夹,看看会发生什么。从那时起,每次我打开应用程序时,它都会尝试将我的示例文件保存在 iCloud 中,但它不起作用(reloadiCloud() 函数设置为在 ViewWillAppear 中运行)。我还需要做些什么来创建 iCloud Drive 文件夹吗?我的代码如下。

func reloadiCloud() {
    ubiquityURL = filemgr.url(forUbiquityContainerIdentifier: nil)

    guard ubiquityURL != nil else {
        print("Unable to access iCloud Account")
        return
    }

    ubiquityURL = ubiquityURL?.appendingPathComponent("Documents")

    metaDataQuery = NSMetadataQuery()

    metaDataQuery?.predicate = NSPredicate(format: "NOT %K.pathExtension = ''", NSMetadataItemFSNameKey)
    metaDataQuery?.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]

    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.metadataQueryDidFinishGathering), name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: metaDataQuery!)

    metaDataQuery!.start()
}

func metadataQueryDidFinishGathering(notification: NSNotification) -> Void {
    let query: NSMetadataQuery = notification.object as! NSMetadataQuery

    query.disableUpdates()

    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: query)

    query.stop()

    if query.resultCount > 0 {
        fileList = []
        for var i in (0..<query.resultCount) {
            let currentFileURL = query.value(ofAttribute: NSMetadataItemURLKey, forResultAt: i) as! URL
            fileList.append(currentFileURL.lastPathComponent)
            tableView.reloadData()
        }
        tableView.reloadData()
        print(fileList)
    } else {
        let sampleFile = Bundle.main.url(forResource: "Sample", withExtension: "pdf")!
        movetoiCloud(forURL: sampleFile)
    }
}



func movetoiCloud(forURL: URL) {
    let fileName = forURL.lastPathComponent
    ubiquityURL = filemgr.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents/\(fileName)")

    //Check if the filename exists and add "copy" to the new version
    for var i in (0..<fileList.count) {
        if fileList[i] == forURL.lastPathComponent {
            let base = ubiquityURL?.absoluteURL.deletingLastPathComponent()
            let endIndex = fileName.index(fileName.endIndex, offsetBy: -4)

            let truncatedExtension = fileName.substring(from: endIndex)
            let truncatedName = fileName.substring(to: endIndex).appending(" copy").appending(truncatedExtension)

            ubiquityURL = base?.appendingPathComponent(truncatedName)
            print("New ubiquity URL: \(ubiquityURL)")
        }
    }

    do {
        try filemgr.setUbiquitous(true, itemAt: forURL, destinationURL: (ubiquityURL)!)
        reloadiCloud()
        print("Move to iCloud OK")
    } catch let error {
        print("moveToiCloud failed: \(error.localizedDescription)")
    }
}
4

1 回答 1

3

尝试更新 info plist 中的捆绑包编号和版本,需要增加这些值才能使 icloud 添加生效。

于 2017-03-29T10:06:24.440 回答