添加自定义原生代码

编辑

学习如何向您的 Expo 项目添加自定义原生代码。


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

使用包含原生代码的库

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 来实现,而不是直接修改原生项目目录中的源文件或使用配置插件添加代码,这与其他插件的兼容性较差。