如何打开UIImagePickerController并直接定位至上次选图的相册?
如何让UIImagePickerController直接定位到上次选中的相册位置
答案是肯定的,但实现方式要根据你适配的iOS版本来选:
一、iOS 14+:用PHPickerViewController(强烈推荐)
苹果在iOS 14推出了PHPickerViewController,作为UIImagePickerController的官方替代方案,它原生支持记住用户上次选择的相册位置,完全基于公开API,没有审核风险。
你甚至不需要额外配置,系统会自动帮你记住位置。举个例子:
var picker: PHPickerViewController? // 初始化picker func setupImagePicker() { let config = PHPickerConfiguration() config.filter = .images // 仅允许选择图片 picker = PHPickerViewController(configuration: config) picker?.delegate = self } // 打开picker func openPicker() { guard let picker = picker else { return } present(picker, animated: true) } // 处理选择结果 extension YourViewController: PHPickerViewControllerDelegate { func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { picker.dismiss(animated: true) // 处理选中的图片资源 for result in results { if result.itemProvider.canLoadObject(ofClass: UIImage.self) { result.itemProvider.loadObject(ofClass: UIImage.self) { image, error in // 在这里处理图片 } } } } }
当你关闭picker后再次打开,系统会自动跳转到用户上次选中的相册,完全不用自己做存储和跳转逻辑。
二、兼容iOS 13及以下:UIImagePickerController的变通方案
UIImagePickerController本身没有公开API支持直接定位到指定相册,但我们可以通过以下方式实现(注意:涉及私有API,有App Store审核被拒的风险):
- 保存上次选中相册的标识符
当用户选完照片后,获取该照片所在相册的localIdentifier,存在UserDefaults里:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { picker.dismiss(animated: true) // 获取选中的PHAsset对象 guard let asset = info[.phAsset] as? PHAsset else { return } // 找到该asset所属的第一个相册(可根据需求调整逻辑) let albumCollections = PHAssetCollection.fetchAssetCollectionsContaining(asset, with: .album, options: nil) if let targetAlbum = albumCollections.firstObject { UserDefaults.standard.set(targetAlbum.localIdentifier, forKey: "LastSelectedAlbumID") } }
- 重新打开时定位到目标相册
初始化UIImagePickerController后,通过KVC设置私有属性来跳转:
func reopenImagePicker() { let picker = UIImagePickerController() picker.sourceType = .photoLibrary picker.delegate = self // 读取之前保存的相册ID if let albumID = UserDefaults.standard.string(forKey: "LastSelectedAlbumID") { // 获取目标相册 let targetAlbums = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [albumID], options: nil) if let targetAlbum = targetAlbums.firstObject { // 通过KVC设置私有属性(注意:私有API可能导致审核被拒) picker.setValue(targetAlbum, forKey: "_selectedAssetCollection") } } present(picker, animated: true) }
⚠️ 重要提醒:使用私有属性_selectedAssetCollection违反苹果开发者协议,大概率会导致App审核被拒。如果你的App需要上架App Store,优先用第一种方案。
总结
- 只适配iOS 14+:直接用
PHPickerViewController,省心又安全,系统原生支持记忆位置。 - 必须兼容iOS 13及以下:可以尝试上述私有API方案,但要做好审核被拒的准备,或者考虑自定义相册选择界面,先让用户选择上次的相册再进入系统picker。
内容的提问来源于stack exchange,提问作者Vivek Lathiya
相关产品推荐
相关产品推荐

