Swift中如何获取iOS相册的标题及对应照片数量?
用Swift获取iOS相册App中可见的相册标题及照片数量
嘿,我刚好做过仿iOS原生相册的需求,这个问题我太熟了!其实核心就是借助Apple的Photos框架,筛选出符合系统相册显示逻辑的相册,再获取它们的标题和资产数量。下面给你一步步拆解实现:
第一步:先搞定相册访问权限
要访问用户相册,必须先请求权限,还要在Info.plist里配置权限描述(不然会直接崩溃):
- 打开
Info.plist,添加键NSPhotoLibraryUsageDescription,值填比如“需要访问您的相册来展示照片”。
然后用代码请求权限:
import Photos PHPhotoLibrary.requestAuthorization { status in guard status == .authorized else { // 这里可以提示用户开启权限,或者做其他处理 return } // 权限通过后,再执行获取相册的逻辑 self.fetchVisibleAlbums() }
第二步:筛选符合显示条件的相册
iOS系统相册的显示规则是:
- 智能相册(比如全景、自拍):除了「最近删除」,空相册不显示;「最近删除」不管有没有内容都显示。
- 用户创建的相册:空相册不显示。
我们可以通过PHAssetCollection来获取这些相册,然后按规则过滤:
func fetchVisibleAlbums() { var visibleAlbums: [(title: String, count: Int)] = [] // 1. 处理智能相册(系统自带的那些,比如全景、自拍、最近删除) let smartAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .any, options: nil) smartAlbums.enumerateObjects { album, _, _ in let assetCount = self.getAssetCount(for: album) var shouldShow = false // 最近删除相册强制显示 if album.assetCollectionSubtype == .smartAlbumRecentlyDeleted { shouldShow = true } else { // 其他智能相册只有有资产时才显示 shouldShow = assetCount > 0 } if shouldShow { let albumTitle = album.localizedTitle ?? "未知相册" visibleAlbums.append((title: albumTitle, count: assetCount)) } } // 2. 处理用户创建的相册 let userAlbums = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: nil) userAlbums.enumerateObjects { album, _, _ in let assetCount = self.getAssetCount(for: album) // 用户相册有资产才显示 if assetCount > 0 { let albumTitle = album.localizedTitle ?? "未知相册" visibleAlbums.append((title: albumTitle, count: assetCount)) } } // 这里visibleAlbums就是符合要求的相册列表了,可以用来更新UI print("可见相册列表:\(visibleAlbums)") }
第三步:计算相册内的资产数量
上面用到的getAssetCount方法,用来统计相册里的照片/视频数量(如果你只想统计照片,可以加过滤条件):
private func getAssetCount(for album: PHAssetCollection) -> Int { let options = PHFetchOptions() // 可选:如果只想统计照片,添加这个过滤条件 // options.predicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.image.rawValue) let assets = PHAsset.fetchAssets(in: album, options: options) return assets.count }
一些额外注意事项
- 本地化标题:用
localizedTitle可以自动获取系统相册的本地化名称,比如中文环境下显示「全景」「自拍」,英文环境显示「Panoramas」「Selfies」,完全贴合原生体验。 - 性能优化:如果相册里资产特别多,
fetchAssets的count可能会稍慢,你可以先尝试用album.estimatedAssetCount,但要注意这个值可能返回PHFetchResultNoEstimate,这时候还是得用实际的assets.count。 - 线程问题:Photos框架的操作尽量放在主线程外执行,获取到数据后再切回主线程更新UI,避免卡顿。
内容的提问来源于stack exchange,提问作者user9494956




