我正在使用PhotoKit将图像和视频存储在“相机胶卷”相册中,并希望允许用户使用UIActivityViewController共享它们。如果我将UIActivityViewController传递给UIImage实例,则它将按预期工作,可能是因为图像数据在内存中传递。但是,视频需要通过URL传递,因为没有与UIImage类似的视频。将URL传递给视频时,出现错误“无法创建沙箱扩展”。如果将URL传递给图像,则会出现类似的错误。
基于this,通过将资产导出到Documents目录,并将UIActivityViewController的URL传递到Documents中的资产,似乎可以解决此错误。但是,我在其他地方读过,“相机胶卷”可以达到类似的目的,这有理由说明,“相机胶卷”将是为数不多的可以保存数据以在应用之间共享的地方之一。
是否可以将UIActivityViewController URL传递给Camera Roll资产,而不将其复制到Document?有没有更好的方法可以共享“相机胶卷”中已有的图像和视频?
实施细节:
我正在使用以下方式为资产生成网址:
func videoFor(asset: PHAsset, resultHander: @escaping (AVAsset?, AVAudioMix?, [AnyHashable : Any]?) -> Void) {
imageManager.requestAVAsset(forVideo: asset, options: nil, resultHandler: resultHander)
}
func urlFor(asset: PHAsset, resultHandler: @escaping (URL?) -> Void) {
if ( asset.mediaType == .video ) {
videoFor(asset: asset) { (asset, audioMix, info) in
let asset = asset as! AVURLAsset
resultHandler(asset.url)
}
}
else if ( asset.mediaType == .image ) {
let options: PHContentEditingInputRequestOptions = PHContentEditingInputRequestOptions()
options.canHandleAdjustmentData = {(adjustmeta: PHAdjustmentData) -> Bool in
return true
}
asset.requestContentEditingInput(with: options, completionHandler: {(contentEditingInput: PHContentEditingInput?, info: [AnyHashable : Any]) -> Void in
resultHandler(contentEditingInput!.fullSizeImageURL as URL?)
})
}
else {
resultHandler(nil)
}
}
这是我尝试通过URL共享图像时在控制台中遇到的完整错误:
Failed to determine whether URL /var/mobile/Media/DCIM/100APPLE/IMG_0201.JPG (n) is managed by a file provider
Could not create sandbox extension. Error: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" UserInfo={NSLocalizedDescription=Could not create sandbox extension of type com.apple.app-sandbox.read for URL /var/mobile/Media/DCIM/100APPLE/IMG_0201.JPG. Error: No such file or directory}
...以及视频:
Failed to determine whether URL /var/mobile/Media/DCIM/100APPLE/IMG_0202.M4V (n) is managed by a file provider
Could not create sandbox extension. Error: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" UserInfo={NSLocalizedDescription=Could not create sandbox extension of type com.apple.app-sandbox.read for URL /var/mobile/Media/DCIM/100APPLE/IMG_0202.M4V. Error: Operation not permitted}
答案 0 :(得分:0)
我今天遇到了同样的问题。这是我的解决方案。希望这有助于或引导您走上正确的道路。
PHImageManager.default().requestExportSession(forVideo: video, options: nil, exportPreset: AVAssetExportPresetPassthrough) { (exportSession, nil) in
if let exportSession = exportSession {
exportSession.outputURL = destinationURLForFile
exportSession.outputFileType = AVFileType.m4v
exportSession.exportAsynchronously() {
// Load the share sheet using destinationURLForFile
}
}
}
这是将视频导出到提供的位置destinationURLForFile
(我使用了Documents目录。如果文件已经存在,请确保删除该文件,否则导出可能无法进行,因为它可能不会覆盖该文件) 。
您可以根据可用类型设置类型。我需要M4V。
然后,导出异步并仅调用共享表或您拥有的任何共享机制。