【问题标题】:phResourceManager.writeData(for... wont run on iOS 14ResourceManager.write Data(for... 不会在 iOS 14 上运行
【发布时间】:2020-11-07 00:03:56
【问题描述】:

在我的 iPhone 上更新到 iOS 14 之前,这段代码运行良好。之后,iOS 14 奇怪地没有运行......这很奇怪,我在网上没有看到任何解决方案,另外根据我的调查,我也没有看到任何变化。

此代码用于从导入的相机胶卷中检索此视频的 videoURL(我使用导入照片...)。

phResourceManager.writeData(for: resource.last!, toFile: newURL!, options: resourceRequestOptions) { (error) in
    if error != nil {
        print(error, "not c67omplted error?")
    } else {
        print("woah completedd 345?")
        
        newUserTakenVideo.videoURL = newURL
        print(newUserTakenVideo.videoURL, "<--?")
    }
}

编辑: 需要明确的是,它“不运行”意味着完成块永远不会运行......因为它甚至永远不会运行并给出错误,完成块根本不会被调用(至少没有打印......)

这是一个打印语句,打印出我传递给参数的所有值:

phResourceManager:

resource.last:

Optional(<PHAssetResource: 0x28128bc00> {
    type: video
    uti: public.mpeg-4
    filename: v07044090000bu6n1nhlp4leque7r720.mp4
    asset: C97B45D3-7039-4626-BA3E-BCA67912A2A9/L0/001
    locallyAvailable: YES
    fileURL: file:///var/mobile/Media/DCIM/113APPLE/IMG_3404.MP4
    width: 576
    height: 1024
    fileSize: 4664955
    analysisType: unavailable
    cplResourceType: Original
    isCurrent: YES
}) 

新网址: 可选(file:///var/mobile/Containers/Data/Application/E2792F47-142E-4601-8D5B-F549D03C9AFE/Documents/Untitled%2027228354.MP4)

resourceRequestOptions:

注意:这是资源变量的声明:

let resource = PHAssetResource.assetResources(for: (cell?.assetPH)!)

【问题讨论】:

  • “不运行”是什么意思?您还没有真正说明问题所在。如果执行路径到达代码,代码肯定会运行
  • 检查编辑! :)
  • 有人找到解决办法了吗?

标签: ios swift ios14 phasset


【解决方案1】:

我有办法解决这个问题! Swift 4+,在 iOS 14 上测试!

我使用 PHAssetResourceRequest 进行了查看,但文件名在此过程中被弄乱了,而且它通常不适用于我的沙箱。然后我也尝试从 PHAsset 请求 AVPlayerItem 但这也不适用于沙盒...

但是,我尝试简单地使用 PHAssetResourceManager.default().writeData(... 并且似乎开始工作了!

我测试了更多,似乎可以工作,这是完整的代码:

                    let resource = PHAssetResource.assetResources(for: (cell?.assetPH)!)
                    let resourceRequestOptions = PHAssetResourceRequestOptions() 
                    
                    let newURL = ExistingMediaVC.newFileUrl
                    
                    PHAssetResourceManager.default().writeData(for: resource.last!, toFile: newURL!, options: resourceRequestOptions) { (error) in
                        if error != nil {
                            print(error, "error")
                        } else {
                            print("good")
                            newUserTakenVideo.videoURL = newURL
                        }
                    }

很简单!!告诉我是否有任何问题,并注意我仍然使用您在原始代码中使用的 ExisitingMedia.fileURL 变量:)

【讨论】:

  • 这很好用!我想对 phassetresourcemanager 的确认有问题:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 2021-09-21
  • 1970-01-01
相关资源
最近更新 更多