我在将视频作为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上服务的连接”
上面描述的技术以前曾经起作用,不仅适用于图像,而且适用于视频。
在解决此问题方面的任何帮助将不胜感激!