Xcode中自定义获取相册视频上传Firebase遇权限问题求助
解决自定义CollectionView获取视频上传Firebase权限问题
我之前也碰到过几乎一模一样的问题!核心原因是:你通过自定义CollectionView获取视频时,虽然拿到了正确的文件路径,但没有获得系统授予的文件读取权限;而系统自带的UIImagePickerController会自动处理权限校验和临时授权,所以能正常上传。
下面是具体的排查和解决步骤:
1. 确认相册权限配置是否完整
首先检查Info.plist里的权限声明是否齐全:
- 对于iOS 13及以下,需要添加
NSPhotoLibraryUsageDescription,描述你的App为什么需要访问相册; - 对于iOS 14及以上,除了上面的字段,还可以根据需求添加
NSPhotoLibraryAddUsageDescription(如果需要写入相册)。
这些字段必须添加,否则App连访问相册的基础权限都没有,更别说读取文件内容了。
2. 正确获取带权限的视频URL
不要直接使用PHAsset的localIdentifier拼接路径,或者直接取file://格式的路径——这种路径没有系统的临时授权,Firebase上传时会因权限不足报错。
正确的做法是通过PHAsset的requestContentEditingInput方法获取带权限的URL,示例代码如下:
import Photos func getAuthorizedVideoURL(for asset: PHAsset, completion: @escaping (URL?) -> Void) { guard asset.mediaType == .video else { completion(nil) return } let options = PHContentEditingInputRequestOptions() options.isNetworkAccessAllowed = true // 如果视频在iCloud上,允许网络获取 asset.requestContentEditingInput(with: options) { editingInput, info in guard let editingInput = editingInput, let videoURL = editingInput.fullSizeImageURL else { completion(nil) return } // 这里拿到的videoURL是带有系统临时授权的,可直接用于Firebase上传 completion(videoURL) } }
调用这个方法拿到URL后,再传给你的Firebase上传函数,就能解决权限问题。
3. 提前校验权限状态
在获取视频之前,先检查相册权限状态,如果未授权,主动请求用户授权:
func checkPhotoLibraryPermission() { let status = PHPhotoLibrary.authorizationStatus(for: .readWrite) switch status { case .notDetermined: PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in if status == .authorized { // 权限已获取,开始加载视频 } else { // 提示用户开启权限 } } case .authorized: // 权限已存在,直接加载视频 break case .denied, .restricted: // 提示用户去设置里开启权限 break @unknown default: break } }
为什么ImagePickerController可以正常工作?
系统的UIImagePickerController在用户选择视频后,会自动为App生成一个带有临时访问权限的沙盒URL,这个URL的权限是系统认可的,所以Firebase能正常读取并上传。而自定义CollectionView如果直接取路径,相当于绕过了这个权限校验环节,导致读取失败。
内容的提问来源于stack exchange,提问作者D'Shawn




