You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Xcode中自定义获取相册视频上传Firebase遇权限问题求助

解决自定义CollectionView获取视频上传Firebase权限问题

我之前也碰到过几乎一模一样的问题!核心原因是:你通过自定义CollectionView获取视频时,虽然拿到了正确的文件路径,但没有获得系统授予的文件读取权限;而系统自带的UIImagePickerController会自动处理权限校验和临时授权,所以能正常上传。

下面是具体的排查和解决步骤:

1. 确认相册权限配置是否完整

首先检查Info.plist里的权限声明是否齐全:

  • 对于iOS 13及以下,需要添加 NSPhotoLibraryUsageDescription,描述你的App为什么需要访问相册;
  • 对于iOS 14及以上,除了上面的字段,还可以根据需求添加NSPhotoLibraryAddUsageDescription(如果需要写入相册)。

这些字段必须添加,否则App连访问相册的基础权限都没有,更别说读取文件内容了。

2. 正确获取带权限的视频URL

不要直接使用PHAsset的localIdentifier拼接路径,或者直接取file://格式的路径——这种路径没有系统的临时授权,Firebase上传时会因权限不足报错。

正确的做法是通过PHAssetrequestContentEditingInput方法获取带权限的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

火山引擎 最新活动