Хранение мультимедиа в CloudKit как CKAsset работает только для изображений, больше не для видео - PullRequest
0 голосов
/ 14 января 2020

У меня проблема с сохранением видео в CloudKit как CKAsset. Хотя приведенный ниже пример кода работает только для сохранения изображений (установите для videoSelection значение false), в прошлом я мог использовать его также для хранения видео в CloudKit. В настоящее время я использую XCode 11.3 с языком программирования Swift и симуляторами и физическими устройствами с установленным iOS 13.2. Отладчик показывает, что данные Актива правильно извлекаются в fun c imagePickerController после выбора видео с полным URL. При попытке записать данные видео CKAsset в iCloud выдается сообщение об ошибке, в том числе «подключение к сервису на pid 0 с именем com.apple.cloudd».

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, что новая запись с полем актива определенного размера (например, 47 КБ) была правильно добавлена ​​после выполнения кода в SelectImageOrMedia (), imagePickerController () и iCloud_WriteRecord () в этом порядке. При попытке сделать то же самое для видео (с videoSelection = true) отладчик действительно указывает, что mediaAsset (CKAsset) был правильно инициализирован с полным URL-путем. Тем не менее, любая попытка записать видео актив с помощью iCloud_WriteRecord () в коде генерирует следующее сообщение об ошибке без сохранения записи:

Получена ошибка подключения для операции 2676FFA25279B538: Ошибка Domain = NSCocoaErrorDomain Code = 4097 "подключение к службе на pid 0 с именем com.apple.cloudd" UserInfo = {NSDebugDescription = подключение к службе на pid 0 с именем com.apple.cloudd}

Техника, описанная выше, использовалась прежде, не только для изображений, но и для видео.

Любая помощь в решении этой проблемы будет высоко ценится!

1 Ответ

0 голосов
/ 23 января 2020

Я смог сам разобраться, как решить проблему. Оказалось, что файл ресурса был удален автоматически перед отправкой ресурса. Копирование видеофайла (с помощью кода) во временное местоположение перед инициализацией ресурса сделало свое дело. Решение, похоже, работает как на тренажерах, так и на физических устройствах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...