原正常运行的MPMediaPickerController功能突然报错,是什么原因?
问题根源
该报错为iOS 15及更高版本对媒体库访问权限规则调整后的常见问题,现有配置缺少Entitlement相关权限项,访问逻辑也存在兼容漏洞。
解决方案
- 打开Xcode项目的Signing & Capabilities标签页,添加
Apple Music能力,勾选Media Library Access选项,补齐报错提示缺失的com.apple.accounts.appleaccount.fullaccess权限配置。 - 提前触发媒体库权限请求,不要在初始化
MPMediaPickerController时才触发权限校验,确保仅在拿到授权后再唤起选择器,参考代码:
import MediaPlayer func checkMediaPermissionAndOpenPicker() { let status = MPMediaLibrary.authorizationStatus() switch status { case .authorized: selectAudioFromIpod() case .notDetermined: MPMediaLibrary.requestAuthorization { [weak self] newStatus in guard newStatus == .authorized else { return } DispatchQueue.main.async { self?.selectAudioFromIpod() } } default: // 此处可添加引导用户到系统设置开启权限的逻辑 print("无媒体库访问权限") } }
- 兼容无本地缓存的订阅音频场景:如果用户选中的是未下载到本地的Apple Music订阅曲目,
MPMediaItemPropertyAssetURL会默认返回nil,属于系统预期行为,可在获取URL为空时增加提示,告知用户仅支持选取本地存储的音频文件。 - 优化原有代码的强制解包逻辑,避免异常场景下崩溃:
func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) { dismiss(animated: true) { [weak self] in guard let audioItem = mediaItemCollection.items.first, let audioURL = audioItem.value(forProperty: MPMediaItemPropertyAssetURL) as? URL else { print("无法获取有效音频地址,请确认选择的是本地存储的音频文件") return } self?.audioAsset = AVAsset(url: audioURL) } }
内容的提问来源于stack exchange,提问作者Hope
相关产品推荐
相关产品推荐

