「Swift」保存图片至相册

前言:需要将图片下载至本地相册
使用到的三方库:
swift 复制代码
TZImagePickerController
SVProgressHUD

实现步骤:

1.新增App权限:需获取相册读写权限

在info.plist中添加以下两个权限和相应的Key值

Privacy - Photo Library Additions Usage Description(相册写入权限)

Privacy - Photo Library Usage Description(相册读取权限)

2.代码实现获取相册权限:
swift 复制代码
	private func initView() {
        self.view.backgroundColor = UIColor.white
        self.title = "保存图片"
        
        imageView = UIImageView(image: UIImage.image(.fruit_mango))
        
        let tapImageView = UITapGestureRecognizer(target: self, action: #selector(tapImageView))
        imageView.addGestureRecognizer(tapImageView)
        imageView.isUserInteractionEnabled = true
        
        self.view.addSubview(imageView)
        
        imageView.snp.makeConstraints { make in
            make.top.equalTo(Common.navigatorHeight + 20.fit())
            make.left.equalTo(20.fit())
            make.right.equalTo(-20.fit())
            make.height.equalTo(Common.screenWidth - 40.fit())
        }
    }

    
    @objc
    private func tapImageView() {
        let authorizationStatus = PHPhotoLibrary.authorizationStatus()
        
        if authorizationStatus == .notDetermined {
            /// 首次保存 权限未知 需进行相册权限授权操作
            PHPhotoLibrary.requestAuthorization { status in
                if status == .authorized {
                    if let image = self.imageView.image {
                        self.saveImage(image: image)
                    }
                    
                } else {
                    self.alertUser(message: "请在iPhone的"设置--隐私--相册"选项中,允许此App访问你的相册。")
                }
            }
            
        } else if authorizationStatus == .authorized {
            /// 权限允许
            if let image = self.imageView.image {
                self.saveImage(image: image)
            }
            
        } else {
            /// 权限不允许
            self.alertUser(message: "请在iPhone的"设置--隐私--相册"选项中,允许此App访问你的相册。")
        }
   }
3.保存图片功能实现:
swift 复制代码
private func saveImage(image: UIImage) {
     let imageManager = TZImageManager()
     imageManager.savePhoto(with: image) { asset, error in
         if asset != nil {
             SVProgressHUD.showSuccess(withStatus: "保存成功")
         }
         
         if error != nil {
             SVProgressHUD.showError(withStatus: "保存失败")
         }
     }
 }
4.其余补充代码:
swift 复制代码
/// 弹窗提示
private func alertUser(message: String) {
     let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
     alert.addAction(UIAlertAction(title: "设置", style: UIAlertAction.Style.default, handler: { (_) in
         DispatchQueue.main.async {
             self.openApplicationSetting()
         }
     }))
     alert.addAction(UIAlertAction(title: "知道了", style: UIAlertAction.Style.cancel, handler: nil))
     present(alert, animated: true, completion: nil)
}
 
/// 打开设置
func openApplicationSetting() {
     if let settingsURL = URL(string: UIApplication.openSettingsURLString) {
         UIApplication.shared.open(settingsURL, options: [:], completionHandler: nil)
     }
}

效果图:


补充:获取相册权限在iOS14版本后有更新的方法,更加清晰了需要获取onlyadd还是readWrite权限,如果只需添加图片的话仅获取onlyadd权限即可,在info.plist中仅添加相册写入权限和相应的Key值即可,但由于App的受众人群更广,通常会采用上述方法实现

新方法相关代码:
swift 复制代码
if #available(iOS 14, *) {
    PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in
        if status == .authorized {
            if let image = self.imageView.image {
                self.saveImage(image: image)
            }
            
        } else {
            self.alertUser(message: "请在iPhone的"设置--隐私--相册"选项中,允许此App访问你的相册。")
        }
    }
} else {
    // Fallback on earlier versions
}

整理不易,望大家多多点赞,谢谢大家!

相关推荐
大龄秃头程序员1 天前
Swift Concurrency 取消机制踩坑复盘:为什么很多人会误以为 Task 根本取消不了?
swift
软泡芙5 天前
【IOS】 Swift Package Manager (SPM) 指南
网络·ios·swift
东坡肘子5 天前
不是模型变慢了,是任务变大了 -- 肘子的 Swift 周报 #146
人工智能·swiftui·swift
大龄秃头程序员5 天前
Sendable 不是“能跑就行”:Swift Concurrency 下的实战踩坑与架构落地指南
swift
大熊猫侯佩6 天前
WWDC26 全新 SwiftData 的 .codable 宏选项:它不是泛型专用胶水
数据库·swift·apple
大龄秃头程序员6 天前
Swift 并发实战:从 Task 到 Actor 重入性,我掉进了“逻辑不一致”的坑
swift
LinXunFeng6 天前
给 Flutter 插件加上 Swift Package Manager 支持
flutter·swift
大龄秃头程序员7 天前
Swift 面试反直觉:Property Wrapper 真的拿不到宿主 self 吗?
swift
FeliksLv7 天前
从 +load 到 Swift Macros:自动注册的演进与实践
ios·objective-c·swift