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

Next.js从v8升级到v10后react-player在iOS端音频播放回调异常

问题根因
  1. 基础逻辑偏差:音频播放完成默认触发的是onEnded回调,仅用户手动暂停、代码主动调用暂停接口才会触发onPause。你当前仅绑定了onPause回调,旧版本react-player内部做了兼容,播放结束时会额外触发onPause,该兼容逻辑在iOS环境下失效。
  2. iPhone端独有适配问题:
  • iPhone上所有浏览器均使用WebKit内核,对HTML5音频事件的触发规则与Chromium内核不同,当播放器尺寸被设置为极小值、或未开启音频预加载时,部分事件回调会被系统拦截。
  • 你使用的react-player v1.6.6存在已知iOS适配缺陷,未正确将原生音频的ended事件绑定到组件的onEnded回调上。
解决方案
  1. 补全回调绑定:同时绑定onEnded和onPause到同一个结束处理逻辑,抹平端差异,同时新增preload属性解决iOS音频状态监听异常:
<ReactPlayer
     id='soundPlayer'
     height='1px'
     width='1px'
     ref={this.ref}
     playing={playing}
     volume={1}
     url={file}
     onPlay={this.onPlay}
     onPause={this.handlePlayStop} // 原有暂停逻辑迁移到公共方法handlePlayStop
     onEnded={this.handlePlayStop} // 新增播放结束回调绑定
     onProgress={this.onProgress}
     onDuration={this.onDuration}
     playsinline={true}
     preload="auto" // 新增预加载配置
     file='forceAudio'/>
  1. 新增兜底逻辑:在onProgress回调中添加播放进度判断,避免极端情况下回调丢失:
onProgress = (progress) => {
  // 保留原有进度处理逻辑
  if (this.state.duration && progress.played >= 0.99) {
    // 进度接近总时长时主动触发结束逻辑
    this.handlePlayStop()
  }
}
  1. 依赖版本升级:如果上述方案无效,可将react-player升级到v2.10.0及以上版本,该版本已官方修复iOS音频onEnded回调不触发的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:24:02