0

我正在开发一个应用程序,该应用程序的概念是从不同的 iPhone 设备将 .csv 文件存储在 iCloud 中。如果我在设备上使用与我创建证书相同的 iCloud 帐户登录,则文件存储功能可以正常工作。我的应用程序要求是我必须将 .csv 文件存储到不同设备的 iCloud 存储中,这些设备可能是使用不同的苹果帐户登录。

以下是我用于文件存储的代码。

extension FarmerTVC{

private func createCSV() -> Void {
    let fileName = getDocumentsDirectory().appendingPathComponent(importFileName)
    var csvOutputText = "Name, Country, Latitude, Longitude\n"

    guard self.allFarmer?.count != 0 else{
        print("There have no active farmer list")
        return
    }

    print("........................Exporting the details....................")

    for farmerDetails in self.allFarmer! {
        let fullName = "\(farmerDetails.firstName) \(farmerDetails.middleName) \(farmerDetails.lastName)"

        let newDetails = "\(fullName),\(farmerDetails.country), \(farmerDetails.latitude), \(farmerDetails.longitude)\n"
        print("\(newDetails)")
        csvOutputText.append(newDetails)
    }

    self.removeExistFileFromDirectory()



    do {
        try csvOutputText.write(to: fileName, atomically: true, encoding: String.Encoding.utf8)
        print("........................Coplete Exporting the File....................\n \(fileName)")
        self.createDirectory()
        //CloudDataManager.sharedInstance.copyFileToCloud()
    } catch {
        print(".........................Failed to create file........................")
        print("\(error)")
    }
    //let activity = UIActivityViewController(activityItems: ["your results", fileName], applicationActivities: nil)
    //present(activity, animated: true)
}

private func getDocumentsDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    return paths[0]
}

private func removeExistFileFromDirectory(){
    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let url = NSURL(fileURLWithPath: path)
    if let pathComponent = url.appendingPathComponent(importFileName) {
        let filePath = pathComponent.path
        let fileManager = FileManager.default
        if fileManager.fileExists(atPath: filePath) {
            print("File Alreday exist in the directory")
            do {
                try fileManager.removeItem(atPath: filePath)
                print("File removed from the directory")
            }catch{
                print("\(error)")
            }
        } else {
            print("FILE NOT AVAILABLE")
        }
    } else {
        print("FILE PATH NOT AVAILABLE")
    }
}}



extension FarmerTVC{
//Create iCloud Drive directory
func createDirectory(){
    if isICloudContainerAvailable() {
        if let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents") {
            if (!FileManager.default.fileExists(atPath: iCloudDocumentsURL.path, isDirectory: nil)) {
                do {
                    try FileManager.default.createDirectory(at: iCloudDocumentsURL, withIntermediateDirectories: true, attributes: nil)
                    print("File path not avaliable in the iCloud Drive")
                    self.copyDocumentsToiCloudDirectory()
                }
                catch {
                    //Error handling
                    print("Error in creating doc")
                }
            }else{
                print("Alreday Have the document path in the icloud.")
                self.copyDocumentsToiCloudDirectory()
            }
        }
    }
    else {
        self.ShowAlertMsg(title: "Oops!", msg: "Not logged into iCloud")

    }
}

//Copy files from local directory to iCloud Directory
func copyDocumentsToiCloudDirectory() {
    if isICloudContainerAvailable() {
        guard let localDocumentsURL = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: .userDomainMask).last else { return }

        let fileURL = localDocumentsURL.appendingPathComponent(importFileName)

        guard let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents").appendingPathComponent(importFileName) else { return }

        var isDir:ObjCBool = false

        if FileManager.default.fileExists(atPath: iCloudDocumentsURL.path, isDirectory: &isDir) {
            do {
                try FileManager.default.removeItem(at: iCloudDocumentsURL)
                print("Remove the old existing file from the iCloud drive")
            }
            catch {
                //Error handling
                print("Error in remove item")
            }
        }

        do {
            try FileManager.default.copyItem(at: fileURL, to: iCloudDocumentsURL)
            self.ShowAlertMsg(title: "Saved!", msg: "File saved into your iCloud drive")
        }
        catch {
            //Error handling
            print("Error in copy item")
        }
    }
    else {
        self.ShowAlertMsg(title: "Oops!", msg: "Not logged into iCloud")

    }
}

func ShowAlertMsg(title: String, msg: String) {
    let alert = UIAlertController(title: title, message: msg, preferredStyle: UIAlertController.Style.alert)

    alert.addAction(UIAlertAction(title: "OK",
                                  style: UIAlertAction.Style.default,
                                  handler: {(_: UIAlertAction!) in
    }))
    self.present(alert, animated: true, completion: nil)
}

//To check user logged in to iCloud
func isICloudContainerAvailable() -> Bool {
    if FileManager.default.ubiquityIdentityToken != nil {
        return true
    }
    else {
        return false
    }
}}

info.plist 文件代码 签名与能力

如果我登录到我为应用程序创建证书和 iCloud 容器的同一个 iCloud 帐户,它对我来说很好。但我不会将文件存储在不同 iCloud 帐户的 iCloud 中。我的问题是

  1. 我们可以将文件存储在不同的 iCloud 帐户上吗?如果是,那怎么办?
  2. 我们可以使用 iCloud 存储为不同的 Apple id 分发应用程序吗?
  3. 您能否就如何将 .csv 文件存储到不同设备中的 iCloud 存储中提出建议,这些设备可能是使用不同的苹果帐户登录的?

我希望我的观点清楚。请给我您宝贵的建议,我该如何解决这个问题。

提前致谢。

4

1 回答 1

0

如果您想跨多个设备在多个 iCloud 帐户之间共享文件,我建议使用CloudKit存储文件。

您可以将文件作为一个或多个CKRecords 的一部分保存在应用程序的公共数据库(而不是私有数据库)中。您还可以利用CKShare在特定个人之间进行共享,但这需要更多的工作。

Apple 最近才通过 iCloud Drive(iOS 13 和 macOS 10.15)启用共享文件,但据我所知,没有 API 可以做到这一点。用户必须自己做。因此,除非您使用 CloudKit 执行此操作,否则您的应用程序无法管理文件。

我希望这会有所帮助。

于 2020-06-17T19:14:36.397 回答