Функция обратного вызова requestExportSession никогда не вызывается. Проблема возникает только на iOS 13 - PullRequest
2 голосов
/ 07 октября 2019

У меня проблема при попытке получить видеофайл с устройства пользователя.

Это функция, которая работала на iOS 12, которая мне кажется правильной. Функция requestExportSession вызывается, но никогда не выполняет код обратного вызова. Я пользуюсь Swift 4.

private func getVideo(asset:AssetViewModel, completion: @escaping (contentData?) -> ()) {

    guard let avAsset = asset.video else {completion(nil); return}
    guard self.createTempDirectory() == true else {completion(nil); return}

    let options = PHVideoRequestOptions()
    options.isNetworkAccessAllowed = true

    let fileName = (avAsset as! AVURLAsset).url.lastPathComponent
    let exportFileName = "\(asset.uuid).\(self.vidExt)"
    let fileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("upload").appendingPathComponent(exportFileName)
    var fileSize: Int = 0
    var success:Bool = false

    let videoGroup = DispatchGroup()

    videoGroup.enter()

    PHImageManager.default().requestExportSession(forVideo: asset.image, options: options, exportPreset: AVAssetExportPreset1280x720) { (exportSession, info) in
        guard let exportSession = exportSession else {success = false; videoGroup.leave(); return}
        exportSession.outputURL = fileURL
        exportSession.outputFileType = AVFileType.mp4
        exportSession.exportAsynchronously(completionHandler: {
            if exportSession.status == AVAssetExportSessionStatus.completed {
                let asset = AVURLAsset(url: fileURL)
                fileSize = asset.fileSize ?? 0
                success = true
                videoGroup.leave()
            }
        })
    }

    videoGroup.wait()

    if success {
        completion(contentData(imageURL: fileURL, fileSize: fileSize, uuid: asset.uuid, fileName: fileName, ext: self.vidExt))
    } else {
        completion(nil)
    }
}
...