使用本地凭据

编辑页面

了解在使用 EAS 时如何配置和使用本地凭据。


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

通常情况下,你不需要成为代码签名专家,因为可以让 EAS 帮你处理。不过,在某些情况下,一些用户可能希望自行管理项目的 keystore、证书和配置文件。

如果你想管理自己的应用签名凭据,可以使用 credentials.json 向 EAS Build 提供本地文件系统中凭据的相对路径,以及用于签名构建的相关密码。

credentials.json

如果你启用了本地凭据配置,你需要在项目根目录下创建一个 credentials.json 文件,它看起来应该类似这样:

credentials.json
{ "android": { "keystore": { "keystorePath": "android/keystores/release.keystore", "keystorePassword": "paofohlooZ9e", "keyAlias": "keyalias", "keyPassword": "aew1Geuthoev" } }, "ios": { "provisioningProfilePath": "ios/certs/profile.mobileprovision", "distributionCertificate": { "path": "ios/certs/dist-cert.p12", "password": "iex3shi9Lohl" } } }

记得将 credentials.json 和你的所有凭据都添加到 .gitignore 中,这样就不会意外将它们提交到仓库,从而可能泄露你的密钥。

Android 凭据

如果你想构建 Android 应用二进制文件,你需要有一个 keystore。如果你还没有发布用的 keystore,可以使用下面的命令自行生成一个(将 KEYSTORE_PASSWORDKEY_PASSWORDKEY_ALIAScom.expo.your.android.package 替换为你选择的值):

Terminal
keytool \
-genkey -v \ -storetype JKS \ -keyalg RSA \ -keysize 2048 \ -validity 10000 \ -storepass KEYSTORE_PASSWORD \ -keypass KEY_PASSWORD \ -alias KEY_ALIAS \ -keystore release.keystore \ -dname "CN=com.expo.your.android.package,OU=,O=,L=,S=,C=US"

一旦你的电脑上有了 keystore 文件,你应该把它移动到合适的目录。我们建议你将 keystore 保存在 android/keystores 目录中。记得将所有发布用 keystore 都加入 git-ignore! 如果你已经运行了上面的 keytool 命令,并将 keystore 放到了 android/keystores/release.keystore,你可以通过在 .gitignore 中添加以下一行来忽略该文件:

.gitignore
android/keystores/release.keystore

创建 credentials.json 并使用这些凭据进行配置:

credentials.json
{ "android": { "keystore": { "keystorePath": "android/keystores/release.keystore", "keystorePassword": "KEYSTORE_PASSWORD", "keyAlias": "KEY_ALIAS", "keyPassword": "KEY_PASSWORD" } }, "ios": { %%placeholder-start%%... %%placeholder-end%% } }
  • keystorePath 指向 keystore 在你电脑上的位置。支持相对路径(相对于项目根目录)和绝对路径。
  • keystorePassword 是 keystore 密码。如果你按照前面的步骤操作,它就是 KEYSTORE_PASSWORD 的值。
  • keyAlias 是密钥别名。如果你按照前面的步骤操作,它就是 KEY_ALIAS 的值。
  • keyPassword 是密钥密码。如果你按照前面的步骤操作,它就是 KEY_PASSWORD 的值。

iOS 凭据

构建 iOS 应用二进制文件还需要一些额外的前置条件。你需要一个付费的 Apple Developer Account,然后需要为你的应用生成 Distribution Certificate 和 Provisioning Profile,这可以通过 Apple Developer Portal 完成。

一旦你的电脑上有了 Distribution Certificate 和 Provisioning Profile,你应该把它们移动到合适的目录。我们建议你将它们保存在 ios/certs 目录中。在本文档的其余部分,我们假设它们分别命名为 dist.p12profile.mobileprovision

记得把存放凭据的目录添加到 .gitignore 中,这样就不会意外将它们提交到仓库,从而可能泄露你的密钥。

如果你已将凭据放在建议的目录中,可以通过在 .gitignore 中添加以下一行来忽略这些文件:

.gitignore
ios/certs/*

创建(或编辑)credentials.json 并使用这些凭据进行配置:

credentials.json
{ "android": { %%placeholder-start%%... %%placeholder-end%% }, "ios": { "provisioningProfilePath": "ios/certs/profile.mobileprovision", "distributionCertificate": { "path": "ios/certs/dist.p12", "password": "DISTRIBUTION_CERTIFICATE_PASSWORD" } } }
  • provisioningProfilePath 指向 Provisioning Profile 在你电脑上的位置。支持相对路径(相对于项目根目录)和绝对路径。
  • distributionCertificate.path 指向 Distribution Certificate 在你电脑上的位置。支持相对路径(相对于项目根目录)和绝对路径。
  • distributionCertificate.password 是位于 distributionCertificate.path 的 Distribution Certificate 的密码。

多目标项目

如果你的 iOS 应用使用了App 扩展,例如 Share Extension、Widget Extension 等,那么你需要为 Xcode 项目的每个 target 提供凭据。这是必要的,因为每个扩展都由各自独立的 bundle identifier 标识。

假设你的项目由一个主应用 target(名为 multitarget)和一个 Share Extension target(名为 shareextension)组成。

在这种情况下,你的 credentials.json 应如下所示:

credentials.json
{ "ios": { "multitarget": { "provisioningProfilePath": "ios/certs/multitarget-profile.mobileprovision", "distributionCertificate": { "path": "ios/certs/dist.p12", "password": "DISTRIBUTION_CERTIFICATE_PASSWORD" } }, "shareextension": { "provisioningProfilePath": "ios/certs/shareextension-profile.mobileprovision", "distributionCertificate": { "path": "ios/certs/another-dist.p12", "password": "ANOTHER_DISTRIBUTION_CERTIFICATE_PASSWORD" } } } }

设置凭据来源

你可以通过在构建配置中指定 "credentialsSource": "local""credentialsSource:" "remote" 来告诉 EAS Build 应该如何解析凭据。

  • 如果提供 "local",则将使用 credentials.json
  • 如果提供 "remote",则凭据将从 EAS 服务器解析。

例如,也许你希望在部署到 Amazon Appstore 时使用本地凭据,而在部署到 Google Play Store 时使用远程凭据:

eas.json
{ "build": { "amazon-production": { "credentialsSource": "local", "android": { // ... } }, "google-production": { "credentialsSource": "remote", "android": { // ... } } } }

如果你没有设置任何选项,"credentialsSource" 的默认值将是 "remote"

在从 CI 触发的构建中使用本地凭据

在开始设置 CI 任务之前,请确保你的 credentials.jsoneas.json 文件已按上述说明配置好。

开发者通常会通过环境变量向 CI 任务提供密钥。这个方法的一个挑战是,credentials.json 文件包含一个 JSON 对象,可能很难正确转义,因此你可以将其分配给一个环境变量。解决这个问题的一种方法是将文件转换为 base64 编码字符串,将该值设置为环境变量,然后在 CI 中再解码并恢复文件。

请考虑以下步骤:

  • 在控制台中运行以下命令,基于你的凭据文件生成 Base64 字符串:
    Terminal
    base64 credentials.json
  • 在你的 CI 中,使用上面命令的输出设置 CREDENTIALS_JSON_BASE64 环境变量。
  • 在 CI 任务中,使用一个简单的 shell 命令恢复文件:
    Terminal
    echo $CREDENTIALS_JSON_BASE64 | base64 -d > credentials.json

同样,你也可以对 keystore、provisioning profile 和 distribution certificate 进行编码,以便之后在 CI 中恢复它们。要成功使用 CI 中的本地凭据触发构建,你必须确保所有凭据都存在于 CI 实例的文件系统中(并且位置与 credentials.json 中定义的相同)。

一旦恢复步骤就绪,你就可以使用 从 CI 触发构建 指南中描述的相同步骤来触发构建。