Video 将媒体存储到CloudKit作为CKAsset仅适用于图像,不再适用于视频

Video 将媒体存储到CloudKit作为CKAsset仅适用于图像,不再适用于视频,video,uiimagepickercontroller,cloudkit,pid,ckasset,Video,Uiimagepickercontroller,Cloudkit,Pid,Ckasset,我在将视频保存到CloudKit作为CKAsset时遇到问题。虽然下面的示例代码用于保存图像,但仅将videoSelection设置为false,我过去也可以使用它将视频存储到CloudKit。我目前正在使用XCode 11.3和Swift编程语言,以及安装了iOS 13.2的模拟器和物理设备。调试器指示在选择具有完整URL的视频后,在func imagePickerController中正确检索资产数据。尝试将视频CKAsset数据写入iCloud时,会生成一条错误消息,包括连接到名为com.

我在将视频保存到CloudKit作为CKAsset时遇到问题。虽然下面的示例代码用于保存图像,但仅将videoSelection设置为false,我过去也可以使用它将视频存储到CloudKit。我目前正在使用XCode 11.3和Swift编程语言,以及安装了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.
    }
}
我可以通过在CloudKit仪表板上验证,在按顺序执行SelectImageOrMedia、imagePickerController和iCloud_WriterRecord中的代码后,是否已正确添加具有特定大小资产字段(例如47kB)的新记录,从而检查它是否适用于图像。当对videoSelection=true的视频尝试相同的操作时,调试器确实指示mediaAsset CKAsset已使用完整的url路径正确初始化。但是,在代码中使用iCloud_WriterRecord写入视频资源的任何尝试都会在不存储记录的情况下生成以下错误消息:

操作2676FFA25279B538出现连接错误:错误域=NSCOCAERRORDOMAIN代码=4097连接到名为com.apple.cloudd的pid 0上的服务用户信息={NSDebugDescription=连接到名为com.apple.cloudd的pid 0上的服务}

上述技术以前不仅适用于图像,也适用于视频


任何协助解决此问题将不胜感激

我能自己想出解决这个问题的办法。事实证明,资产文件是在可以调度资产之前自动删除的。在初始化资产之前,通过代码将视频文件复制到一个非临时位置就可以实现这一点。该解决方案似乎可以在模拟器和物理设备上运行