通过CKAsset将媒体存储到CloudKit仅适用于图像,不再适用于视频

我在将视频作为CKAsset保存到CloudKit时遇到问题。尽管下面的示例代码仅用于保存图像(将videoSelection设置为false),但过去我也能够使用它来将视频存储到CloudKit。我目前正在使用带有Swift编程语言的XCode 11.3,安装了iOS 13.2的模拟器和物理设备。选择具有完整URL的视频后,调试器指示在func imagePickerController中正确检索了资产数据。尝试将视频CKAsset数据写入iCloud时,会生成一条错误消息,包括“连接到名为com.apple.cloudd的pid 0上的服务”。

import UIKit
import CloudKit
import AVKit
import AVFoundation

class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
 let videoSelection: Bool =  false //if true,then select video,if false select image
 var SelectedAsset: CKAsset? = nil
 var imagePicker = UIImagePickerController()

    func iCloud_WriteRecord()
       {
        let newCloudRecord = CKRecord (recordType: "TestRecordType",recordID: CKRecord.ID (recordName: "myRecordID0001"))
        newCloudRecord.setvalue (SelectedAsset,forKey: "CKAssetfield")
        CKContainer(identifier: "iCloud.CLCO.INT45.activity01").privatecloudDatabase.save (newCloudRecord) { (record,error) in

            if record != nil {
                   if (error != nil) {
                       print("error 1")
                       return;
                   }

                   print("success")
               }
               else
               {
                   print("error 2")
                   return;
               }

           }
       }

    @IBaction func SelectImageOrMedia(_ sender: UIButton) {

        if videoSelection {imagePicker.mediaTypes = ["public.movie"]} else {imagePicker.mediaTypes = ["public.image"]}

        imagePicker.sourceType =  .photolibrary
        imagePicker.delegate = self
        imagePicker.allowsEditing = true
        present (imagePicker,animated: true,completion: nil)

    }

          func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
           {

               if let image = info[UIImagePickerController.InfoKey.editedImage]
                   as? UIImage //image
               {
                let mediaAsset = CKAsset(fileURL: info[UIImagePickerController.InfoKey.imageURL] as! URL)
                SelectedAsset = mediaAsset
                imagePicker.dismiss(animated: true,completion: nil)
                return;

               }
               else //video
               {

                let mediaAsset = CKAsset(fileURL: info[UIImagePickerController.InfoKey.mediaURL] as! URL)
                let tmpVideoURL: String = mediaAsset.fileURL!.absoluteString
                SelectedAsset = mediaAsset
                imagePicker.dismiss(animated: true,completion: nil)

                return;
               }


           } //func

    @IBaction func SaveTestRecord(_ sender: UIButton) {

               iCloud_WriteRecord()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

通过在SelectImageOrMedia(),imagePickerController()中执行代码后,我可以在CloudKit仪表板上验证是否已正确添加具有一定大小(例如47kB)的Asset字段的新记录,从而检查它是否适用于图像和iCloud_WriteRecord()的顺序。当尝试对视频进行相同操作(使用videoSelection = true)时,调试器确实指示已使用完整的url路径正确初始化了mediaAsset(CKAsset)。但是,在代码中使用iCloud_WriteRecord()写入视频资产的任何尝试都会产生以下错误消息,而不存储记录:

收到操作2676FFA25279B538的连接错误:错误域= NSCocoaErrorDomain代码= 4097“在名为com.apple.cloudd的pid 0上服务的连接” UserInfo = {NSDebugDescription =在名为com.apple.cloudd的pid 0上服务的连接”

上面描述的技术以前曾经起作用,不仅适用于图像,而且适用于视频。

在解决此问题方面的任何帮助将不胜感激!

hca0728 回答:通过CKAsset将媒体存储到CloudKit仅适用于图像,不再适用于视频

我能够自己弄清楚如何解决问题。事实证明,可以在调度资产之前自动删除资产文件。在初始化资产之前,将视频文件(通过代码)复制到非临时位置就可以了。该解决方案似乎可以在模拟器和物理设备上使用。

本文链接:https://www.f2er.com/2771870.html

大家都在问