SuperAPI AI 工具集

photokit

编程与开发

查看项目

更新于 10-16 09:11

技能介绍

用途

PhotoKit 提供在 iOS 应用中实现、审查或改进照片选择、相机拍摄与媒体处理的现代模式。目标平台为 iOS 26+、Swift 6.3,未特别标注的模式向后兼容至 iOS 16。

主要能力

照片选择(PhotosPicker,SwiftUI,iOS 16+)

PhotosPicker 是 UIImagePickerController 的原生 SwiftUI 替代方案。它进程外运行,浏览照片库无需照片库权限,支持单选和多选,并可按媒体类型过滤。资料给出单选(绑定 PhotosPickerItem,通过 onChange 异步加载)、多选(绑定 [PhotosPickerItem],设置 maxSelectionCount)的示例代码。

媒体类型过滤使用 PHPickerFilter 组合:仅图片 .images、仅视频 .videos、仅 Live Photo .livePhotos、仅截图 .screenshots,以及 .any(of:) 与 .all(of:) 配合 .not() 的组合条件。

选中项可通过 loadTransferable(type:) 异步加载,也可自定义 Transferable 类型(DataRepresentation)自动解码。加载应放在 Task 中,并处理 nil 返回与抛出的错误。

隐私与权限

照片库有两种访问级别:仅添加(NSPhotoLibraryAddUsageDescription)和读写(NSPhotoLibraryUsageDescription)。请求 .readWrite 时系统会自动展示有限照片库选择器。PhotosPicker 浏览无需权限,仅在需要读取整个照片库(如自定义图库)或保存照片时才需要显式请求权限。资料给出照片库权限与相机权限的检查/请求示例代码,以及权限被拒绝时的处理视图(引导跳转系统设置)。必需的 Info.plist 键包括照片库读取、照片库写入、相机,以及录制带声音视频所需的麦克风键;缺少必需键会导致权限弹窗出现时崩溃。

相机拍摄基础

相机会话应放在独立的 @Observable 模型中管理,仅由 representable 视图显示预览。资料给出最小相机管理器示例:配置 sessionPreset、添加摄像头输入与 AVCapturePhotoOutput、start/stop 方法,以及相机权限请求。startRunning() 和 stopRunning() 是阻塞的同步调用,需在后台队列执行。

SwiftUI 中的相机预览通过 UIViewRepresentable 包装 AVCaptureVideoPreviewLayer,并重写 layerClass 实现自动尺寸调整。视图应在 task 中配置并启动,在 onDisappear 中调用 stop(),因为运行中的采集会话会独占相机并耗电。

图片加载与显示

AsyncImage 可用于远程图片,按 empty/success/failure 阶段分别处理,但不会跨视图重绘缓存图片;生产应用图片较多时应使用专门的图片加载库或基于 URLCache 的缓存。

大图降采样使用 ImageIO 的 CGImageSource,配合 kCGImageSourceThumbnailMaxPixelSize 等选项,将全分辨率照片加载为显示尺寸的 CGImage,避免内存峰值(48MP 照片未压缩可超过 200 MB)。该方式适用于列表、网格或缩略图展示,应把 PhotosPickerItem 的原始 Data 直接交给降采样器。

图片渲染模式方面,照片与美术素材用 .original,应跟随当前 tint 色的图标用 .template。

常见错误(资料列出)

不要用 UIImagePickerController 做照片选择;不要在只需选图时请求完整照片库权限;不要为缩略图加载全分辨率图片;不要在主线程加载 PhotosPickerItem 数据;不要忘记在视图消失时停止 AVCaptureSession;不要假设相机权限已授予;不要在主线��调用 startRunning();不要在 UIViewRepresentable 内部创建 AVCaptureSession。

审查清单(资料列出)

使用 PhotosPicker 而非已弃用的 UIImagePickerController;Info.plist 中包含相机/照片库隐私描述;处理异步图片/视频加载状态;显示前用 CGImageSource 降采样大图;相机会话在后台线程启动、在 onDisappear 停止;权限拒绝时提供设置深链;AVCaptureSession 由模型持有;媒体资源类型与选择器结果在并发边界上满足 Sendable。

适用场景

需要在 iOS 应用中加入照片选择、相机拍摄、图片加载与媒体权限处理的开发与代码审查场景。

限制

资料仅涉及 iOS 平台、SwiftUI/UIKit 与 AVFoundation;参考文档(references/photokit-patterns.md、references/camera-capture.md、references/image-loading-caching.md、references/av-playback.md)的具体内容暂未提供。