У меня проблема с сохранением видео в 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}
Техника, описанная выше, использовалась прежде, не только для изображений, но и для видео.
Любая помощь в решении этой проблемы будет высоко ценится!