Swift中如何获取已保存到系统相册的图片?
如何找回保存到系统相册的图片
嘿,这个需求用iOS的Photos框架就能完美解决,核心思路是记录图片在系统相册里的唯一标识,后续通过这个标识精准定位找回。具体步骤如下:
1. 替换保存逻辑,记录图片的唯一标识
你之前用的UIImageWriteToSavedPhotosAlbum虽然能存图,但没法直接拿到图片的唯一标识。建议换成Photos框架的保存方法,这样能直接获取到localIdentifier(系统给每张相册图片分配的唯一ID),然后把这个ID存在UserDefaults里,APP重启后也能读取:
import Photos func saveImageToAlbum(_ image: UIImage) { PHPhotoLibrary.requestAuthorization { status in guard status == .authorized else { // 这里处理权限拒绝的情况,比如提示用户去设置打开权限 return } PHPhotoLibrary.shared().performChanges({ // 创建图片请求并拿到标识 let creationRequest = PHAssetChangeRequest.creationRequestForAsset(from: image) guard let assetID = creationRequest.placeholderForCreatedAsset?.localIdentifier else { return } // 把标识存到UserDefaults UserDefaults.standard.set(assetID, forKey: "SavedImageLocalID") }) { success, error in if !success { // 处理保存失败的情况 print("保存图片失败:\(error?.localizedDescription ?? "未知错误")") } } } }
2. APP重启后通过标识找回图片
当你需要找回图片时,先从UserDefaults取出之前存的localIdentifier,再用Photos框架根据这个ID获取对应的图片资源,最后把资源转换成UIImage:
func fetchSavedImage(completion: @escaping (UIImage?) -> Void) { PHPhotoLibrary.requestAuthorization { status in guard status == .authorized else { completion(nil) return } // 取出之前保存的标识 guard let assetID = UserDefaults.standard.string(forKey: "SavedImageLocalID") else { completion(nil) return } // 根据标识获取图片资源 let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [assetID], options: nil) guard let asset = fetchResult.firstObject else { // 图片可能被用户从相册删除了 completion(nil) return } // 请求图片数据,这里可以根据需求调整targetSize和contentMode let imageManager = PHImageManager.default() let options = PHImageRequestOptions() options.deliveryMode = .highQualityFormat // 优先高清图 options.resizeMode = .exact // 按指定尺寸返回 imageManager.requestImage(for: asset, targetSize: CGSize(width: 300, height: 300), contentMode: .aspectFill, options: options) { image, _ in completion(image) } } }
3. 注意事项
- 权限处理:一定要先请求相册访问权限,如果用户拒绝,要引导用户到系统设置里开启权限,否则无法访问相册。
- 异常情况:如果用户在相册里删除了这张图片,
fetchAssets会返回空,这时候要给用户友好提示(比如“图片已被删除”)。 - 图片尺寸:
requestImage的targetSize可以根据你的实际需求调整,比如传PHImageManagerMaximumSize获取原图,但要注意内存占用。
内容的提问来源于stack exchange,提问作者KingCoder11
相关产品推荐
相关产品推荐

