Swift中无法将Firebase Storage远程图片保存至相机胶卷问题排查
问题原因分析
你遇到的这个问题其实很常见——PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL:)这个API只支持本地文件的URL,而你传入的是Firebase Storage的远程HTTPS链接,系统没办法直接从网络地址创建相册资产,所以才会抛出NSCocoaErrorDomain Code=-1这个模糊的错误。
解决方法:先下载图片再保存
正确的做法是先通过URLSession把远程图片下载成数据,转成UIImage之后再保存到相机胶卷。这里是修正后的代码:
// 替换成你的Firebase图片URL let photoUrl = URL(string: "https://firebasestorage.googleapis.com/v0/b/nearbie-ee55a.appspot.com/o/wallpaper_pictures%2F52YgRFw4jWhYL5ulK11slBv7e583_E6A1D795-ED73-4C1E-98E1-CC97FF87E4C1?alt=media&token=0b090de3-43ab-426a-b63b-9d61372732d0")! URLSession.shared.dataTask(with: photoUrl) { data, response, error in guard let imageData = data, let image = UIImage(data: imageData) else { print("图片下载失败或转成UIImage失败: \(error?.localizedDescription ?? "未知错误")") return } PHPhotoLibrary.shared().performChanges({ PHAssetChangeRequest.creationRequestForAsset(from: image) }) { success, error in if let err = error { print("保存到相机胶卷失败: \(err)") } else { print("图片保存成功!") } } }.resume()
额外注意点:
- 别忘了在
Info.plist中添加NSPhotoLibraryAddUsageDescription权限描述,否则保存时会被系统拒绝。 - 下载操作是异步的,要确保在主线程之外执行;相册操作的回调也是在后台线程,如果需要更新UI,记得切回主线程。
内容的提问来源于stack exchange,提问作者K.Wu
相关产品推荐
相关产品推荐

