Совместно использовать PHAsset, сохраненный в рулоне камеры, с помощью UIActivityViewController - PullRequest
0 голосов
/ 07 марта 2019

Я храню изображения и видео в альбоме Camera Roll с помощью PhotoKit и хочу, чтобы пользователь мог делиться ими с помощью UIActivityViewController.Если я передаю UIActivityViewController экземпляр UIImage, он работает как положено, вероятно, потому, что данные изображения передаются в память.Тем не менее, видео нужно передавать по URL, потому что нет аналога видео UIImage.Когда я передаю URL-адрес видео, я получаю сообщение об ошибке «Не удалось создать расширение для песочницы».Если я передаю URL-адрес изображения, я получаю похожую ошибку.

Исходя из этого , кажется, что я мог бы обойти эту ошибку, экспортировав ресурсы вКаталог документов и передача UIActivityViewController URL-адреса ресурса в Документы.Тем не менее, я читал в другом месте, что Camera Roll может служить аналогичной цели, и само собой разумеется, что Camera Roll будет одним из немногих мест, где могут храниться данные для обмена между приложениями.

Есть лиспособ передачи URL-адресов UIActivityViewController в ресурсы Camera Roll без их копирования в документы?Есть ли лучший способ делиться изображениями и видео, которые уже есть в Camera Roll?


Детали реализации:

Я создаю URL-адреса для ресурсов, используяэто:

    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}

1 Ответ

0 голосов
/ 09 марта 2019

Я застрял на той же проблеме сегодня.Вот мое решение.Надеюсь, что это поможет или направит вас по правильному пути.

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.Затем экспортируйте async и просто вызовите общий ресурс или какой-либо другой механизм обмена.

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