添加自定义原生代码

编辑页面

了解如何向你的 Expo 项目添加自定义原生代码。


For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.

你可以通过以下一种或两种方式来添加自定义原生代码:

使用包含原生代码的库

Expo 和 React Native 开发者通常会把绝大部分时间花在编写 JavaScript 代码,以及使用通过诸如 expo-camerareact-native-safe-area-contextreact-native 本身等库提供的原生 API 和组件上。这些库允许开发者从其 JavaScript 代码中访问并使用设备功能。它们也可能提供对使用原生代码实现的第三方服务 SDK 的访问(例如 @sentry/react-native,它为 Android 和 iOS 上的 Sentry 原生 SDK 提供绑定)。

使用 Expo Go?

如果你正在使用 Expo Go你只能访问 Expo SDK 中包含的原生库,或者不包含任何自定义原生代码的库(了解更多)。创建开发构建后,你就可以像在其他原生应用中一样更改原生代码或配置。

在开发构建中安装带有自定义原生代码的库

在使用 开发构建时,使用带有自定义原生代码的库非常简单:

  • 使用 npm 安装该库,例如:npx expo install react-native-localize
  • 如果该库包含 配置插件,你可以在应用配置中指定你偏好的配置。
  • 创建一个新的开发构建(可以在本地或使用 EAS)。

现在你就可以在应用代码中使用这个库了。

关键概念和开发工作流

开发概览提供了使用 Expo 开发应用时的关键概念以及核心开发循环的流程说明。

编写原生代码

使用 Expo Modules API 来编写 Swift 和 Kotlin 代码,并通过原生模块和视图为你的应用添加新能力。虽然你也可以使用其他工具来构建原生模块,但我们认为使用 Expo Modules API 能让构建和维护几乎所有类型的 React Native 模块变得尽可能简单。我们认为,对于大多数为自己的应用构建原生模块的开发者来说,Expo Modules API 是最佳选择。

我什么时候应该考虑编写原生代码?

当某个库无法完全满足你的需求时,这种情况很常见。例如,该库可能无法访问某个特定的平台功能,或者第三方服务可能没有为 React Native 提供绑定。

你是否在考虑主要用 C++ 编写一个模块?

如果你打算主要用 C++ 编写一个原生模块,你可能需要了解 React Native 提供的 Turbo Modules API

使用 Expo Modules API

Expo Modules API:概览

Expo 提供的用于开发原生模块的 API 和工具概览。

教程:创建原生模块

关于使用 Expo Modules API 创建一个持久化设置的原生模块的教程。

教程:创建原生视图

关于使用 Expo Modules API 创建一个渲染原生 WebView 组件的原生视图的教程。

创建本地模块

如果你打算在单个应用中使用你的原生模块(之后你随时可以改变主意),我们建议使用“本地” Expo 模块来编写自定义原生代码。本地 Expo 模块的功能与库开发者以及 Expo SDK 内部使用的 Expo Modules 类似,例如 expo-camera,但它们不会发布到 npm。相反,你会直接在项目中创建它们。

创建本地模块会在项目的 modules 目录中生成一个 Swift 和 Kotlin 模块,并且这些模块会自动链接到你的应用。

Terminal
npx create-expo-module@latest --local
npx expo run

与多个应用共享模块

如果你打算在多个应用中使用你的原生模块,那么请使用 npx create-expo-module@latest, 去掉 --local 标志,并创建一个独立模块。你可以将你的包发布到 npm,或者把它放到 monorepo 中的 packages 目录里(如果你有的话),以类似本地模块的方式使用它。

使用连续原生生成(CNG)时的注意事项

以下建议在使用 CNG 时最为重要,但即使你不使用它们,也同样是很好的指导原则。

在本地构建,以获得最佳调试体验和快速反馈

默认情况下,使用 create-expo-app 创建的 Expo 项目会使用 CNG,并且在你于项目中运行 npx expo prebuild 命令之前,不会包含 androidios 原生目录。在使用 CNG 时,开发者通常不会将 androidios 目录提交到源代码管理,也不会在本地生成它们,因为 EAS Build 会在构建过程中自动完成这些工作。尽管如此,在编写自定义原生代码时,通常会生成原生目录并使用 npx expo run 在本地构建,这样可以获得快速的反馈循环,并在 Android Studio / Xcode 中完整访问原生日志和调试工具。

使用配置插件进行原生项目配置

如果你的原生代码需要你更改项目配置,例如修改项目的 AndroidManifest.xmlInfo.plist你应该通过配置插件来应用这些更改,而不是直接修改 androidios 目录中的文件。请记住,当你使用 CNG 时,直接对原生项目目录所做的更改会在下次运行 prebuild 时丢失。

使用事件订阅器来挂接应用生命周期事件

如果你需要挂接 Android 生命周期事件或 AppDelegate 方法,请使用 Expo Modules 为 AndroidiOS 提供的 API 来实现,而不要直接修改原生项目目录中的源文件,或者使用配置插件来添加这些代码,因为这样与其他插件的组合性不佳。