Ios 如何使用Swift将音频文件保存到iCloud?

Ios 如何使用Swift将音频文件保存到iCloud?,ios,swift,xcode,icloud,cloudkit,Ios,Swift,Xcode,Icloud,Cloudkit,我使用Swift 3和Xcode 8.3.3创建了一个应用程序,它记录音频文件并将其保存到应用程序的文档目录中。我现在想将这些文件保存到iCloud以进行备份。我已经能够使用以下代码将一条简单记录保存到iCloud: let database = CKContainer.default().publicCloudDatabase func saveToCloud(myContent: String){ let myRecord = CKRecord(recordType: "Audio

我使用Swift 3和Xcode 8.3.3创建了一个应用程序,它记录音频文件并将其保存到应用程序的文档目录中。我现在想将这些文件保存到iCloud以进行备份。我已经能够使用以下代码将一条简单记录保存到iCloud:

let database = CKContainer.default().publicCloudDatabase

func saveToCloud(myContent: String){
    let myRecord = CKRecord(recordType: "AudioRecording")
    myRecord.setValue(myContent, forKey: "content")
    database.save(myRecord) { (record, error) in
        print(error ??  "No error")
        guard record != nil else {return}
        print("Saved record to iCloud")
    }
}
似乎我只需要添加一行代码,看起来像这样:

newNote.setValue(audioObject, forKey: "Audio")

但我不确定我需要为
audioObject
传递什么对象,也不确定iCloud是否能够处理该对象。有什么建议吗?

使用iOS 10.x Swift 3.0

您可以将audioObject保存为一团数据;或者用iCloud的话说,是一种资产。下面是一些保存图像的基本代码,但原理是一样的,只是一团数据

这里的代码比您真正需要的要多得多,但我将其保留在上下文中

func files_saveImage(imageUUID2Save: String) {
    var localChanges:[CKRecord] = []
    let image2updated = sharedDataAccess.image2Cloud[imageUUID2Save]

    let newRecordID = CKRecordID(recordName: imageUUID2Save)
    let newRecord = CKRecord(recordType: "Image", recordID: newRecordID)

    let theLinkID = CKReference(recordID: sharedDataAccess.iCloudID, action: .deleteSelf)
    let thePath = sharedDataAccess.fnGet(index2seek: sharedDataAccess.currentSN)
    newRecord["theLink"] = theLinkID
    newRecord["theImageNo"] = image2updated?.imageI as CKRecordValue?
    newRecord["theImagePath"] = sharedDataAccess.fnGet(index2seek: image2updated?.imageS as! Int) as CKRecordValue?
    newRecord["theUUID"] = imageUUID2Save as CKRecordValue?

    let theURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(NSUUID().uuidString+".dat")
    do {
        try image2updated?.imageD.write(to: theURL!)
    } catch let e as NSError {
        print("Error! \(e)");
        return
    }

    newRecord["theImageBlob"] = CKAsset(fileURL:  URL(string: (theURL?.absoluteString)!)!)

    localChanges.append(newRecord)
    let records2Erase:[CKRecordID] = []

    let saveRecordsOperation = CKModifyRecordsOperation(recordsToSave: localChanges, recordIDsToDelete: records2Erase)
    saveRecordsOperation.savePolicy = .changedKeys
    saveRecordsOperation.perRecordCompletionBlock =  { record, error in
    if error != nil {
        print(error!.localizedDescription)
    }
    // deal with conflicts
    // set completionHandler of wrapper operation if it's the case
    }
    saveRecordsOperation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordIDs, error in
        self.theApp.isNetworkActivityIndicatorVisible = false
        if error != nil {
            print(error!.localizedDescription, error!)
        } else {
            print("ok")
        }
    }

    saveRecordsOperation.qualityOfService = .background
    privateDB.add(saveRecordsOperation)
    theApp.isNetworkActivityIndicatorVisible = true
}
如果你想换一种方式,你可以用类似这个狙击手的代码从iCloud解码你的blob

 let imageAsset = record["theImageBlob"] as? CKAsset
                if let _ = imageAsset {
                    if let data = NSData(contentsOf: (imageAsset?.fileURL)!) {
                        imageObject = data
                    }
                }
显然,这个例子同样是在处理图像数据,但你我都知道它的所有数据:)不管它是什么颜色


这里唯一需要注意的是速度,我非常确定资产与普通iCloud对象存放在不同的林中,访问它们可能会稍微慢一点。

Ryan,请告诉我这个答案是否适用于您?勾选绿色框:)