EasyStarter logoEasyStarter

配置 app.json

第一步:将 app.json 中的模板标识替换为你自己的应用信息

配置 app.json

apps/native/app.json 是 Expo 应用的核心配置文件。拿到模板后,第一步就应该把其中属于 EasyStarter 的标识信息替换成你自己的。

详细字段说明参考 Expo 官方 app.json 文档


第一步:确定并创建应用标识

在修改 app.json 之前,先确定你的应用标识,并在 Apple Developer Portal 完成注册。

确定标识符格式

iOS 和 Android 的标识符都推荐使用反向域名格式

com.yourcompany.yourapp

iOS 的 bundleIdentifier 和 Android 的 package 建议保持一致,方便管理。

在 Apple Developer Portal 创建 App ID

iOS 的 bundleIdentifier 不是随意填写的字符串——它必须先在 Apple Developer Portal 注册为 App ID,才能用于 App Store 发布和 Apple 原生能力(如 Sign In with Apple)。

  1. 登录 Apple Developer Portal → Identifiers
  2. 点击 + 新建 → 选择 App IDs → 类型选 App → Continue
  3. 填写 Description(你的应用名)
  4. 填写 Bundle ID(例如 com.yourcompany.yourapp),选择 Explicit
  5. 在 Capabilities 中勾选 Sign In with Apple
  6. 点击 Continue → Register

注册完成后,将这个 Bundle ID 填入以下两处:

apps/native/app.json
{
  "expo": {
    "ios": {
      "bundleIdentifier": "com.yourcompany.yourapp"
    }
  }
}
apps/server/wrangler.jsonc → vars
APPLE_APP_BUNDLE_IDENTIFIER=com.yourcompany.yourapp

Android 包名

Android 不需要提前注册,你只需要在 app.json 中填写一个符合格式的包名即可。在发布到 Google Play 时才需要注册。


必须替换的字段

以下字段直接影响应用身份、深链和应用商店发布,必须在开始开发之前修改

name

应用显示名称,会出现在设备桌面和系统设置中。

"name": "My App"

slug

Expo 服务中的 URL 标识,全局唯一,只能包含字母、数字和连字符。

"slug": "my-app"

scheme

Deep link 协议头,用于 OAuth 回调和应用间跳转。建议与 slug 保持一致,避免与其他 App 冲突。

"scheme": "my-app"

移动端 Better Auth 的 OAuth 回调(Google 登录)依赖这个 scheme。

ios.bundleIdentifier

iOS 应用唯一标识,必须与 Apple Developer Portal 中创建的 App ID 完全一致。

"ios": {
  "bundleIdentifier": "com.yourcompany.yourapp"
}

同时也是 APPLE_APP_BUNDLE_IDENTIFIER 环境变量的值。

ios.appleTeamId

你的 Apple 开发者 Team ID,在 Apple Developer Portal → Membership 页面中可以找到。

"ios": {
  "appleTeamId": "XXXXXXXXXX"
}

android.package

Android 应用包名,必须与 Google Play Console 中注册的包名一致,格式为反向域名。

"android": {
  "package": "com.yourcompany.yourapp"
}

extra.eas.projectIdupdates.url

这两个字段在执行 eas init 后自动生成,绑定到你在 EAS 上的项目。如果你直接克隆了模板,需要先运行:

cd apps/native
eas init

EAS 会自动更新 app.json 中的 projectIdupdates.url


图标与启动页

以下路径指向的图片需要替换为你自己的品牌资产:

字段路径说明
icon./assets/images/icon.png通用图标(1024×1024 PNG)
ios.icon.light./assets/images/icon.pngiOS 浅色模式图标
ios.icon.dark./assets/images/icon.pngiOS 深色模式图标
android.adaptiveIcon.foregroundImage./assets/images/android-icon-foreground.pngAndroid 自适应图标前景
android.adaptiveIcon.backgroundImage./assets/images/android-icon-background.pngAndroid 自适应图标背景
android.adaptiveIcon.monochromeImage./assets/images/android-icon-monochrome.pngAndroid 单色图标
plugins[expo-splash-screen].image./assets/images/icon.png启动屏图片

完整配置参考

apps/native/app.json
{
  "expo": {
    "name": "My App",
    "slug": "my-app",
    "version": "1.0.0",
    "orientation": "portrait",
    "icon": "./assets/images/icon.png",
    "scheme": "my-app",
    "userInterfaceStyle": "automatic",
    "ios": {
      "appleTeamId": "YOUR_TEAM_ID",
      "buildNumber": "1.0.0",
      "bundleIdentifier": "com.yourcompany.yourapp",
      "usesAppleSignIn": true,
      "icon": {
        "dark": "./assets/images/icon.png",
        "light": "./assets/images/icon.png"
      },
      "infoPlist": {
        "ITSAppUsesNonExemptEncryption": false
      }
    },
    "android": {
      "adaptiveIcon": {
        "backgroundColor": "#E6F4FE",
        "foregroundImage": "./assets/images/android-icon-foreground.png",
        "backgroundImage": "./assets/images/android-icon-background.png",
        "monochromeImage": "./assets/images/android-icon-monochrome.png"
      },
      "predictiveBackGestureEnabled": false,
      "permissions": ["android.permission.RECORD_AUDIO"],
      "package": "com.yourcompany.yourapp"
    },
    "extra": {
      "router": {},
      "eas": {
        "projectId": "your-eas-project-id"
      }
    },
    "runtimeVersion": {
      "policy": "appVersion"
    },
    "updates": {
      "url": "https://u.expo.dev/your-eas-project-id"
    }
  }
}