大概搞清楚了一个expo开发react native应用遇到的闪退问题原因,我的情况很特殊,特此记录一下:
1、我使用react-native-voice/voice库处理语音识别,这个功能依赖于两个权限:麦克风和语音识别权限。
2、在权限设置环节有两种做法:一是配置expo插件,自动处理;二是修改info.plist文件,由于我的应用使用expo工作流,我一般不会直接修改ios文件夹内的内容。
3、由于我vibe coding,导致生成的代码改了又改,AI认为我的功能需要使用expo-speech和expo-speech-recogonition这两个库,但是我曾经显示地告诉他我希望使用react-native-voice/voice库,导致代码中导入了三个库,但核心逻辑代码确实按我的要求做了,配置app.json中却配置了expo-speech和expo-speech-recogonition的plugins。
4、由于我没使用expo-speech和expo-speech-recogonition,因此我在app.json文件中删除掉expo-speech和expo-speech-recogonition的plugins,这导致没有处理好系统权限请求(其实react-native-voice/voice库有专门的插件,但由于vibe coding,ai没有用),进而导致了一进入语音识别功能就会闪退的问题。
5、我告诉ai应用会crash,它修改代码逻辑了无数次还是会闪退,最终定位到这个原因,我查了一下ios文件夹内的info.plist文件,确实没注册语音识别权限,于是需要重新修改权限配置,清理依赖关系。
总结一下这个问题的原因
移除 expo-speech 和 expo-speech-recognition 导致闪退的原因可能与以下因素相关:
1. Expo 插件的隐式权限管理 Expo 权限自动化:
Expo 的 expo-speech 和 expo-speech-recognition 插件在预构建阶段会自动处理原生权限配置(如 Android 的录音权限 RECORD_AUDIO 和 iOS 的麦克风权限 NSMicrophoneUsageDescription),即使代码没有显式调用这些库,它们仍然可能通过插件机制注入必要的原生配置。
原生配置依赖:
如果直接使用 react-native-voice 但未手动配置原生权限,移除 Expo 插件会导致权限缺失,应用在调用语音功能时因权限拒绝而闪退。
2. Expo 预构建插件的原生依赖
插件与原生模块的绑定:
Expo 的预构建插件(如 expo-speech)可能包含与 react-native-voice 相关的原生依赖或桥接代码。移除后会导致原生模块无法加载,从而触发崩溃。
自动链接的副作用:
即使我未在代码中调用 Expo 插件,它们可能通过 app.json 中的 plugins 字段自动链接到原生项目。移除插件会破坏这种隐式依赖关系。