iOS 相册和视频 | 青训营笔记

290 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第18天

相册权限获取

权限状态

typedef NS_ENUM(NSInteger, PHAuthorizationStatus) {
    // 暂未获取权限
    PHAuthorizationStatusNotDetermined = 0,
    // 受限状态,没有授权访问相册,用户也无法修改状态(例如家长模式下)
    PHAuthorizationStatusRestricted,
    // 用户拒绝了相册授权
    PHAuthorizationStatusDenied,
    // 用户同意了相册授权
    PHAuthorizationStatusAuthorized,
    // 受限的相册访问,用户会选择部分程序可以访问的相册数据
    PHAuthorizationStatusLimited API_AVAILABLE(ios(14)),
};

权限获取方式1

选择 PHAuthorizationStatusLimited 或者 PHAuthorizationStatusAuthorized 都会返回 PHAuthorizationStatusAuthorized 状态

权限获取方式2

如果希望判断用户是否选择了 PHAuthorizationStatusLimited 状态,可以使用下面的这种方法

相册的加载

UIImagePickerController

PHPickerViewController

自定义选择器

不主动请求权限

系统会返回空结果,并在另一个进程弹出权限请求弹窗。无论选择哪种权限,代码已经执行过了。需要重新进入才能获取到数据

主动请求权限

主动请求权限,可以控制一定选择过权限类型后,再加载数据

与 「不主动请求权限」 不同的是,可以在选择权限后,立刻将数据上屏

视频播放

初始化

  • 通过 URL 创建 AVPlayerItem 供播放器使用,可以认为 AVPlayerItem 就是多媒体数据的管理器
  • 播放时长监听,可能是网络资源,播放时长可能后期设置
  • 加载状态监听,出错时可以进行错误处理
  • 播放速率监听,播放和暂停都等价于设置 rate 值,由于播放可能被打断,例如有电话打过来了,系统会将播放器暂停;挂断后也不会自动恢复
  • 播放进度监听,定时更新进度条

播放控制

  • 点击播放暂停,调用 play/pause
  • 拖拽进度条
    • 通过 seekToTime:toleranceBefore:toleranceAfter: 来调整播放位置
    • 松手时,调用 play

音频控制

为了防止其他 App 的播放影响我们的播放,将 AVAudioSession 设置为 AVAudioSessionCategoryPlayback

类别当按“静音”或者锁屏时是否静音是否引起不支持混音的App中断是否支持录音和播放
AVAudioSessionCategoryAmbient只支持播放
AVAudioSessionCategoryAudioProcessing///
AVAudioSessionCategoryMultiRoute既可以录音也可以播放
AVAudioSessionCategoryPlayAndRecord默认不引起既可以录音也可以播放
AVAudioSessionCategoryPlayback默认引起只用于播放
AVAudioSessionCategoryRecord只用于录音
AVAudioSessionCategorySoloAmbient只用于播放

画中画模式

  • 需要判断设备是否支持
  • 监听 pictureInPicturePossible 是否更新状态,更新后可尝试触发画中画效果
  • 监听应用进入活跃状态(从主屏幕返回时,停止画中画模式)

远端视频播放

网络视频的播放和本地视频的播放并没有太大区别,直接使用本地视频的播放逻辑,有 URL 就能实现播放