You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动