You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:23:02