Expo Prebuild iOS端AppDelegate.mm修改丢失及安卓差异咨询
Expo Prebuild 常见问题解答
1. iOS 替换 AppDelegate.mm 是预期行为吗?
是的,这是expo prebuild的预期行为。Expo 的 prebuild 机制基于项目中的app.json/app.config.js等配置文件,完全重新生成 iOS 和 Android 的原生项目文件,包括 AppDelegate.mm 这类核心原生文件。每次运行 prebuild 时,它会用模板文件覆盖现有文件,因此手动修改的内容会被清除。图标被重新生成同样是预期行为,Expo 会根据app.json里的icon字段自动生成适配各种尺寸的 iOS 图标。
2. 如何持久化 AppDelegate.mm 的修改?
推荐两种可靠方案:
- 使用 Expo Config Plugins:这是官方推荐的方式。你可以编写自定义配置插件,在 prebuild 过程中自动将修改注入到 AppDelegate.mm 中。比如添加原生模块初始化代码,插件可通过修改 AST(抽象语法树)插入代码,避免手动修改被覆盖。具体做法是创建插件文件,用
withAppDelegate函数修改 AppDelegate 内容,再在app.config.js中注册该插件。 - 手动合并修改:如果不想编写插件,可每次运行
expo prebuild --no-install,之后手动对比新生成的 AppDelegate.mm 和之前的修改版本,合并自定义内容。这种方式较繁琐,适合临时修改或简单场景。
3. 为何 Android 平台的变更比 iOS 少?
主要有三点原因:
- Android 项目结构更分散灵活:Android 的原生配置分散在
AndroidManifest.xml、build.gradle、MainActivity.kt等多个文件中,Expo 的 prebuild 模板仅修改必要配置项,而非完全覆盖所有文件。比如自定义代码可放在独立的 Application 类中,不会被 prebuild 覆盖。 - iOS 依赖集成更集中:iOS 多数原生模块的配置需集中在 AppDelegate.mm 中(如初始化第三方 SDK、处理 Deep Link 等),Expo 需完全控制该文件以保证配置一致性;而 Android 可通过清单文件、gradle 配置或单独类处理这些逻辑,无需频繁修改核心 Activity 文件。
- Expo 对 Android 的兼容性策略:Android 版本与设备碎片化更严重,Expo 的 prebuild 机制在 Android 端尽量保留用户自定义修改,仅更新必要部分保证项目可运行,而 iOS 端依赖完全生成的模板避免配置冲突。
内容的提问来源于stack exchange,提问作者Samarth Kadam
相关产品推荐
相关产品推荐

