You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中MPMediaPickerController启动闪退及提前弹出问题排查

解决MPMediaPickerController的两个问题:自动关闭+意外弹出

看起来你碰到了媒体选择器的两个棘手问题:刚启动就秒关,还有本该点击单元格才弹出,结果页面一加载就自动弹出来。我来帮你捋捋可能的原因和解决办法~

先排查「页面启动阶段自动弹出」的问题

这个问题大概率是你在视图控制器的生命周期方法(比如viewDidLoad/viewWillAppear)里不小心调用了present媒体选择器的代码,或者表格的didSelectRowAt被意外触发了(比如不小心设置了自动选中单元格的逻辑)。

  • 先全局搜索你的代码,看看有没有在didSelectRowAt之外的地方创建并present了MPMediaPickerController,如果有,删掉那部分代码。
  • 检查表格的默认选中状态:确保没有在viewDidLoad里调用tableView.selectRow(at:animated:scrollPosition:)这类自动选中单元格的方法。

再解决「启动后立即关闭」的问题

这个问题最常见的两个原因是权限未配置和控制器未被强引用:

1. 配置媒体库访问权限

iOS要求访问用户媒体库必须在Info.plist中添加权限描述,否则系统会直接关闭媒体选择器。根据你的iOS版本,添加对应的键:

  • iOS 9及以上:添加NSAppleMusicUsageDescription,值填你需要向用户说明的访问原因(比如"需要访问您的音乐库以选择歌曲")
  • 更早版本:添加NSMediaLibraryUsageDescription

2. 强引用媒体选择器

你当前的代码里把mediaPicker作为didSelectRowAt里的局部变量,方法执行完毕后这个对象就会被ARC自动释放,导致选择器刚启动就被关闭。解决办法是把它声明为视图控制器的属性:

class MediaViewController: UITableViewController, MPMediaPickerControllerDelegate {
    // 声明为类属性,保持强引用
    private var mediaPicker: MPMediaPickerController?

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if indexPath.section == 2 && indexPath.row == 0 {
            mediaPicker = MPMediaPickerController(mediaTypes: MPMediaType.anyAudio)
            mediaPicker?.delegate = self
            mediaPicker?.prompt = "Select song"
            mediaPicker?.allowsPickingMultipleItems = false
            // 别忘了present控制器!
            if let picker = mediaPicker {
                present(picker, animated: true)
            }
        }
    }

    // 实现代理方法,选择完成后释放picker
    func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
        // 这里处理你选中的媒体项
        dismiss(animated: true)
        self.mediaPicker = nil // 不需要时释放资源
    }

    func mediaPickerDidCancel(_ mediaPicker: MPMediaPickerController) {
        dismiss(animated: true)
        self.mediaPicker = nil
    }
}

额外检查点

  • 确保你已经实现了MPMediaPickerControllerDelegate的两个核心代理方法(didPickMediaItems和mediaPickerDidCancel),否则可能出现异常行为。
  • 测试前先卸载App重新安装,确保权限设置生效(有时候修改Info.plist后热重载不会立刻生效)。

内容的提问来源于stack exchange,提问作者B2Fq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:01:31