React Native Track Player iOS构建停滞100%并崩溃问题求助
React Native Track Player iOS端崩溃:EXC_BAD_ACCESS 在setupPlayer时触发
问题描述
使用react-native-track-player开发音频播放应用,Android端运行完全正常,但iOS端构建到100%后崩溃,抛出错误:com.facebook.react.runtime.JavaScript (9): EXC_BAD_ACCESS (code=1, address=0x0)
该错误仅在添加await TrackPlayer.setupPlayer();代码时触发。
相关代码:
import React, { useEffect } from 'react'; import { View, Button } from 'react-native'; import TrackPlayer,{ Capability } from 'react-native-track-player'; const AudioPlayer: React.FC = () => { useEffect(() => { const setupPlayer = async () => { await TrackPlayer.setupPlayer(); // Ajout de la piste const audioPath = require('../../assets/audio/teddy.mp3'); await TrackPlayer.add({ id: 'trackId', url: audioPath, title: 'Teddy Audio', artist: 'Inconnu', artwork: 'https://www.example.com/artwork.jpg', }); // Configure les contrôles de notification TrackPlayer.updateOptions({ capabilities: [ Capability.Play, Capability.Pause, Capability.Stop, ], compactCapabilities: [ Capability.Play, Capability.Pause, ], notificationCapabilities: [ Capability.Play, Capability.Pause, Capability.Stop, ], }); }; setupPlayer(); return () => { TrackPlayer.stop(); }; }, []); const playAudio = async () => { await TrackPlayer.play(); }; const pauseAudio = async () => { await TrackPlayer.pause(); }; return ( <View> <Button title="Lire l'audio" onPress={playAudio} /> <Button title="Pause" onPress={pauseAudio} /> </View> ); }; export default AudioPlayer;
已尝试但无效的方案:
- 用try-catch包裹初始化代码捕获错误
- 验证React Native与react-native-track-player的版本兼容性
- 配置Android和iOS的必要权限
- 添加dummy.swift文件
可能的解决方案
1. 清理并重新安装iOS Pod依赖
- 进入iOS目录:
cd ios - 移除现有Pods:
pod deintegrate - 删除
Podfile.lock文件和Pods文件夹 - 重新安装依赖并更新仓库:
pod install --repo-update
2. 调整播放器初始化时机与资源清理
将播放器初始化移至App根组件(如App.tsx),避免组件级初始化的竞态问题,同时优化卸载时的资源清理:
// App.tsx中的初始化逻辑 import TrackPlayer, { Capability } from 'react-native-track-player'; import { useEffect } from 'react'; function App() { useEffect(() => { let isMounted = true; const initPlayer = async () => { try { // 先检查服务是否已运行,避免重复初始化 const serviceRunning = await TrackPlayer.isServiceRunning(); if (!serviceRunning) { await TrackPlayer.setupPlayer(); await TrackPlayer.updateOptions({ capabilities: [Capability.Play, Capability.Pause, Capability.Stop], compactCapabilities: [Capability.Play, Capability.Pause], }); } } catch (err) { console.error('播放器初始化失败:', err); } }; initPlayer(); return () => { isMounted = false; // 使用destroy彻底清理播放器资源,而非仅stop TrackPlayer.destroy(); }; }, []); // ...其他组件内容 }
3. 修正本地音频文件的路径处理
iOS对本地资源路径的解析逻辑与Android不同,使用TrackPlayer.resolveAssetUrl处理require的资源:
// 替换原音频路径处理代码 const audioAsset = require('../../assets/audio/teddy.mp3'); const audioPath = TrackPlayer.resolveAssetUrl(audioAsset); await TrackPlayer.add({ id: 'trackId', url: audioPath, title: 'Teddy Audio', artist: 'Inconnu', artwork: 'https://www.example.com/artwork.jpg', });
4. 完善iOS权限与后台模式配置
- 在
Info.plist中添加音频相关权限描述:<key>NSAppleMusicUsageDescription</key> <string>需要访问音频资源以播放本地音频</string> <key>NSMicrophoneUsageDescription</key> <string>需要麦克风权限以支持音频播放控制</string> - 开启Xcode后台模式:进入项目Target -> Signing & Capabilities -> 添加Background Modes -> 勾选
Audio, AirPlay, and Picture in Picture
5. 切换react-native-track-player版本
如果版本兼容性仍有问题,尝试切换到稳定版本:
- 若使用React Native 0.70+,可升级到v4.x系列(如
npm install react-native-track-player@4.0.0) - 若RN版本较低,可降级到v3.x稳定版(如
npm install react-native-track-player@3.2.0)
内容的提问来源于stack exchange,提问作者FrenchBoy
相关产品推荐
相关产品推荐

