AVPlayer audioSessionGotInterrupted 从后台唤醒时的通知

2024-04-11

我使用 AVAudioPlayer 来播放音频。我启用了背景音频并且音频会话配置正确。

我实施了audioSessionGotInterrupted音频会话中断时收到通知的方法。这是我当前的代码:

@objc private func audioSessionGotInterrupted(note: NSNotification) {

    guard let userInfo = note.userInfo,
        let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,
        let type = AVAudioSessionInterruptionType(rawValue: typeValue) else {
            return
    }

    if type == .began {
        print("interrupted")
        // Interruption began, take appropriate actions
        player.pause()
        saveCurrentPlayerPosition()
    }
    else if type == .ended {
        if let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt {
            let options = AVAudioSessionInterruptionOptions(rawValue: optionsValue)
            if options == .shouldResume {
                print("restored")
                // Interruption Ended - playback should resume
                setupPlayer()
                player.play()
            } else {
                // Interruption Ended - playback should NOT resume
                // just keep the player paused
            }
        }
    }
}

现在我执行以下操作:

  • 播放一些音频
  • 锁定手机
  • 暂停音频
  • 等待几秒钟,直到我在 XCode 调试器中看到该应用程序已在后台停止
  • 我在锁屏界面点击播放

我的指挥中心play()方法按预期被调用。然而也audioSessionGotInterrupted方法被调用type == .began.

这怎么可能?我预计不会看到此类通知,或者至少不会.ended

我使用的是 iOS 10 beta 8。


检查这个

https://developer.apple.com/documentation/avfoundation/avaudiosession/1616596-interruptionnotification https://developer.apple.com/documentation/avfoundation/avaudiosession/1616596-interruptionnotification

从 iOS 10 开始,系统将停用大多数应用程序的音频会话,以响应应用程序进程被挂起。当应用程序再次开始运行时,它将收到一条中断通知,表明其音频会话已被系统停用。该通知必然会被及时延迟,因为只有在应用程序再次运行时才能传递该通知。如果您的应用程序的音频会话因此而暂停,则 userInfo 字典将包含值为 true 的 AVAudioSessionInterruptionWasSuspishedKey 键。

如果您的音频会话配置为不可混合(播放、playAndRecord、soloAmbient 和 multiRoute 类别的默认行为),并且在进入后台时未主动使用音频,建议您停用音频会话。这样做可以避免您的音频会话被系统停用(并收到这种有些令人困惑的通知)。

if let reason = AVAudioSessionInterruptionType(rawValue: reasonType as! UInt) {
  switch reason {
  case .began:
    var shouldPause = true
    if #available(iOS 10.3, *) {
      if let _ = notification.userInfo?[AVAudioSessionInterruptionWasSuspendedKey] {
        shouldPause = false
      }
    }
    if shouldPause {
      self.pause()
    }
    break
  case .ended:
    break
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AVPlayer audioSessionGotInterrupted 从后台唤醒时的通知 的相关文章

随机推荐

  • Android Material Design 中的“触摸目标尺寸”到底是什么

    参考有关 Material Design 的 Android 文档 我经常发现我们被引导将按钮的 触摸目标 设置为高度 例如 48dp https www google com design spec components buttons
  • Android:align_left居中对齐

    我有一个包含谷歌地图的片段
  • JSONObject 不是字符串错误

    query count 1 created 2015 07 28T05 19 01Z lang en US results quote symbol GITANJALI NS Ask null AverageDailyVolume null
  • Javascript-从 JSON 对象中检索特定键值

    我想从 Json 对象中仅检索某些键值对 在以唯一 id 作为键的用户列表下方 var user 987654321 displayName Wayne profilepic https test1 com fullName Bruce W
  • 如果启用 SSL 代理,为什么 https 请求在 Charles 代理上失败

    我已经在我的 Mac 上安装并配置了 Charles 代理 我可以浏览所有 http 站点并查看 Charles 中的请求 但无法浏览无法连接的 https 站点 Safari 无法打开该页面 因为它无法建立安全 联系 我已经安装了 Cha
  • 使用最短路径计算连接概率

    我想知道 igraph 中是否有一个函数可以计算加权图中顶点之间的连接概率 其中边的权重是相邻顶点的连接概率 我基于这样的邻接矩阵构建了一个图 其中相邻连接概率形成权重 这是针对河流网络 因此图的每个节点仅连接到单个下游节点 我本来希望使用
  • 检查 iOS 互联网连接是否缓慢

    我添加了苹果提供的可达性类 它可以很好地检查互联网连接 如果互联网关闭 我的应用程序会显示消息 但如果互联网很慢 它就会继续加载 我正在使用 wi fi 当 iPhone 通知栏中只有一个可见的点表示 wifi 信号时 我遇到了这个问题 所
  • 我如何知道主屏幕是否已对焦?

    我有一个在 Android 上运行的服务 我需要知道是否有任何应用程序处于焦点状态 或者 桌面 主屏幕 是否处于焦点状态 我不知道这个词是否适合指手机的主屏幕 我如何知道这是焦点还是其他应用程序 在服务内部 我有以下代码来获取正在运行的任务
  • 我可以在播种时将我的所有产品更新给特定用户吗?

    如何更新所有产品以为其分配特定用户 admin User create name gt Admin password gt password walmart Store create name gt Walmart address gt S
  • 用于存储过程的 SQL 表和列解析器

    是否有一个应用程序可以解析一组给定的存储过程 SQL Server 2000 并获取其中使用的所有表和关联列 存储过程可以包含来自不同数据库的表 输出应该是这样的 表AU 列A 列B 列S 表 列 列 列 我用Database Editio
  • 从给定的 WSDL 创建 PHP SOAP 服务

    这可能会被认为是一个非常懒惰的问题 但我向你保证事实并非如此 我已经尝试了好几天让它工作但我就是做不到 我已经获得了一个 WSDL 文件 我需要用 PHP 为其创建一个 SOAP 服务 谁能告诉我正确的做法是什么 服务的接收者期望在调用 g
  • socket.io 和express 4 个会话

    我想在我的 socket io 应用程序中访问 express 4 会话 我对 Node 不太熟悉 在实现此功能时遇到了一些麻烦 我找到了一个允许访问express 4会话的npm模块 https www npmjs org package
  • 使用 gldrawpixels 进行 opengl 旋转

    我的团队目前仅限于在 opengl 1 4 平台上绘制图像 这意味着我们无法使用任何漂亮的纹理映射来绘制图像 是的 我们仅限于使用 intel 集成图形平台 这非常烦人 到目前为止 我们能够绘制 缩放和翻转图像 但是制作图形的人声称在使用
  • React 应用程序之间可以通信吗?

    我的项目是三个 React 应用程序的旅程 我想使用从应用程序 1 到应用程序 2 以及从应用程序 2 到应用程序 3 的一些数据 如果要传递的数据很小 我会将其传递到第二个应用程序的 url 中的查询参数中 如果数据很大或私密 我计划将其
  • PHPMailer ,通过电子邮件内容与不同的接收者保持 1 个 SMTP 连接

    phpMailer New PHPMailer phpMailer gt isSMTP phpMailer gt SMTPKeepAlive true for Send your emails right away phpMailer gt
  • 如何使用 Moq 模拟 SoapException 来对错误处理进行单元测试

    我继承了一个小型控制台应用程序 用于调用 SOAP Web 服务 这是一个以各种方式记录异常的嵌套 try catch 的悲剧性混乱 我想围绕抛出 SoapException 时它的行为进行一些测试覆盖 问题 当我无法模拟接口并且无法将属性
  • 如何通过Hibernate获取数据库版本?

    有没有办法通过Hibernate 3 2 API获取底层数据库版本的一些信息 我未能在这里和 javadoc 中找到相关位 获取数据库引擎的版本是特定于实现的 这意味着没有获取版本的共享方法 因此 Hibernate 无法真正提供 API
  • 淡入时的 ScrollTop 引导框模式

    我使用 bootbox js 制作模态 但是当模态淡入并且内容太长时 滚动条会到达底部按钮的级别 当模态出现时 我需要滚动条保持在顶部 我已经解决了添加 off shown bs modal 在 bootbox dialog 之后 boot
  • 使用 webview 显示来自 sdcard 的图像不起作用

    我已经在 sdcard 根目录中下载了 map750 png 文件 但是当我尝试在带有一些文本的 Web 视图中显示它时 只显示文本 你能帮我找出代码中的错误吗 谢谢 setContentView R layout webview mWeb
  • AVPlayer audioSessionGotInterrupted 从后台唤醒时的通知

    我使用 AVAudioPlayer 来播放音频 我启用了背景音频并且音频会话配置正确 我实施了audioSessionGotInterrupted音频会话中断时收到通知的方法 这是我当前的代码 objc private func audio