React-Native 0.69.0中iOS端NativeModules.AudioRecorderManager不存在求助
解决React Native 0.69.0中iOS端NativeModules.AudioRecorderManager不存在的问题
临时修复:避免iOS端因模块不存在崩溃
直接在调用前做存在性检查,或结合Platform模块做平台分支处理,确保iOS端不会尝试加载不存在的模块,避免组件启动失败:
import ReactNative, { NativeModules, Platform } from "react-native"; let AudioRecorderManager = null; // 优先判断平台,Android直接使用已有模块 if (Platform.OS === 'android') { AudioRecorderManager = NativeModules.AudioRecorderManager; } else if (NativeModules.AudioRecorderManager) { // 兼容后续iOS端补上实现的情况 AudioRecorderManager = NativeModules.AudioRecorderManager; } // 使用时先判断模块是否存在,再执行逻辑 if (AudioRecorderManager) { // 调用AudioRecorderManager的相关方法 } else { // iOS端替代逻辑:比如提示功能暂未支持,或使用纯JS音频录制方案 }
彻底解决:实现iOS端的AudioRecorderManager NativeModule
如果需要iOS端也支持相同的音频录制功能,需在iOS工程中实现对应的NativeModule:
- 创建iOS原生类
在iOS项目的.xcodeproj中新建Objective-C或Swift类,遵循RCTBridgeModule协议:
Objective-C示例:
// AudioRecorderManager.h #import <React/RCTBridgeModule.h> @interface AudioRecorderManager : NSObject <RCTBridgeModule> @end
// AudioRecorderManager.m #import "AudioRecorderManager.h" #import <AVFoundation/AVFoundation.h> @implementation AudioRecorderManager // 注册模块,RN侧通过该名称调用 RCT_EXPORT_MODULE(); // 导出开始录制方法,支持Promise回调 RCT_EXPORT_METHOD(startRecording:(NSString *)path resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { // 实现iOS音频录制逻辑,比如配置AVAudioRecorder NSError *error = nil; // 录制逻辑代码... if (error) { reject(@"RECORD_ERROR", @"录制启动失败", error); } else { resolve(@"录制已启动"); } } // 导出停止录制方法 RCT_EXPORT_METHOD(stopRecording:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { // 停止录制逻辑 resolve(@"录制已停止"); } @end
Swift示例:
若使用Swift,需先创建桥接文件,再实现模块:
import Foundation import AVFoundation import React @objc(AudioRecorderManager) class AudioRecorderManager: NSObject, RCTBridgeModule { // 注册模块名称 static func moduleName() -> String! { return "AudioRecorderManager" } static func requiresMainQueueSetup() -> Bool { return true } // 导出开始录制方法 @objc func startRecording(_ path: String, resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) { do { // 配置录制参数与逻辑 resolve("录制已启动") } catch { reject("RECORD_ERROR", "录制启动失败", error) } } // 导出停止录制方法 @objc func stopRecording(_ resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) { // 停止录制逻辑 resolve("录制已停止") } }
- 配置权限与编译
在iOS项目的Info.plist中添加麦克风权限申请:
<key>NSMicrophoneUsageDescription</key> <string>需要访问麦克风进行音频录制</string>
之后在Xcode中编译项目,确保无错误,RN即可通过NativeModules.AudioRecorderManager访问iOS端实现。
替代方案:使用社区成熟音频库
若不想自行实现原生模块,可选择社区维护的跨平台音频库,比如react-native-audio或react-native-sound-recorder,这些库已封装好iOS和Android两端的录制功能:
npm install react-native-audio --save cd ios && pod install && cd ..
按照库的文档调用API即可,无需自行处理NativeModule的跨平台兼容问题。
内容的提问来源于stack exchange,提问作者Pentagura
相关产品推荐
相关产品推荐

