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

如何在Mac上写入Photo Library?Swift实现稳定方案咨询

关于在macOS上写入Photo Library的Swift实现方案

Hey there! Let's tackle your two questions step by step—writing to the Mac Photo Library, and finding a stable Swift implementation for it.

1. 如何在Mac上写入Photo Library?

在macOS中写入Photo Library的核心流程分为三步:

  • 申请必要权限:Mac系统对相册访问有严格的权限控制,必须先在Info.plist中添加权限描述,否则会被系统拒绝访问。
  • 检查权限状态:确认用户已经授予写入权限后,才能执行后续操作。
  • 使用PhotoKit执行写入:通过PHPhotoLibrary的performChanges方法提交写入请求,这是官方推荐的异步操作方式,避免阻塞主线程。

权限配置

在项目的Info.plist中添加以下两个键(右键选择"Add Row",输入对应的键名):

  • NSPhotoLibraryAddUsageDescription:填写你需要写入相册的原因(比如"需要将编辑后的图片保存到系统相册"),这是写入权限必须的描述。
  • NSPhotoLibraryUsageDescription:如果你的应用还需要读取相册内容,也需要添加这个描述。

2. Swift在macOS中写入Photo Library的稳定实现方案

你提到的PHAssetCreationRequest其实已经是macOS正式版中的稳定API了,它从macOS 10.13+开始就被纳入正式的PhotoKit框架,可能你看到的是早期Beta版本的文档才会有Beta标记。

下面是一个完整的稳定实现示例,使用Swift将图片数据写入Photo Library:

import Photos

func saveImageToPhotoLibrary(imageData: Data) {
    // 先请求写入权限
    PHPhotoLibrary.requestAuthorization(for: .addOnly) { authorizationStatus in
        guard authorizationStatus == .authorized else {
            print("请在系统设置中允许应用访问相册写入权限")
            return
        }
        
        // 异步执行写入操作
        PHPhotoLibrary.shared().performChanges({
            // 创建图片资产的请求
            let creationRequest = PHAssetCreationRequest.forAsset()
            // 添加图片资源数据
            creationRequest.addResource(with: .photo, data: imageData, options: nil)
            
            // 如果需要设置图片的元数据(比如位置、标题),可以通过creationRequest的properties属性设置
            // creationRequest.location = CLLocation(latitude: 39.9, longitude: 116.3)
            // creationRequest.creationDate = Date()
        }) { success, error in
            DispatchQueue.main.async {
                if success {
                    print("图片已成功保存到Photo Library!")
                } else {
                    print("保存失败:\(error?.localizedDescription ?? "未知错误")")
                }
            }
        }
    }
}

// 调用示例:从本地文件读取图片数据并保存
if let imageURL = Bundle.main.url(forResource: "myPhoto", withExtension: "png"),
   let imageData = try? Data(contentsOf: imageURL) {
    saveImageToPhotoLibrary(imageData: imageData)
}

补充说明

  • 如果你的应用需要兼容macOS 10.12及更早版本,那确实没有官方的稳定写入方案(因为PhotoKit在macOS 10.13才正式引入),但现在主流的macOS版本都已经远高于10.13,所以这个方案完全可行。
  • performChanges方法是异步执行的,所有的写入操作都在后台队列完成,完成后会通过回调返回结果,记得在回调中如果要更新UI,切换回主线程(如示例中的DispatchQueue.main.async)。

内容的提问来源于stack exchange,提问作者Coder949

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:29:30