00 / 00

移动端快速开始

本地跑起 01MVP Expo 应用并连接 Web/API 服务

移动端要连 01MVP 的 Web/API 服务,所以本地开发的顺序是:先启动 Web,再启动 Expo。你可以先用模拟器看界面,等登录、RevenueCat、Deep Link、推送这些原生能力开始出现,再切到 development build 和真机。

开始前确认

这篇只负责把移动端本地跑起来。账号、设备、Apple Developer、Google Play、RevenueCat 和商店资料清单放在 移动应用 入口页,这里不重复。

你会跑起什么

Web/API 服务

vpr @01mvp/web#dev,默认在 http://localhost:7001 提供页面和 /api

Expo 开发服务器

vpr @01mvp/mobile#dev,负责把 JS bundle 发给模拟器、真机或 web preview。

可安装 App

Development 或 preview build,用来验证 Expo Go 覆盖不了的原生能力。

安装依赖

在仓库根目录执行:

vp install

准备移动端环境变量

复制模板文件,再按你的本地地址改值:

cp products/01mvp/apps/mobile/.env.example products/01mvp/apps/mobile/.env.local

常用配置:

变量默认值用途
EXPO_PUBLIC_WEB_URLhttp://localhost:7001Web 站点地址,用于打开网页价格页或登录跳转
EXPO_PUBLIC_SERVER_URLhttp://localhost:7001/apiApp 调用 API、auth、oRPC 的基础地址
EXPO_PUBLIC_APP_SCHEME01mvpApp deep link scheme
EXPO_PUBLIC_AUTH_COOKIE_PREFIX01mvp-sessionBetter Auth cookie 前缀
EXPO_PUBLIC_REVENUECAT_IOS_API_KEYRevenueCat iOS 公钥
EXPO_PUBLIC_REVENUECAT_ANDROID_API_KEYRevenueCat Android 公钥
EXPO_PUBLIC_REVENUECAT_ENTITLEMENT_IDproRevenueCat entitlement 标识

EXPO_PUBLIC_* 会打进 App 包。别把数据库密码、支付密钥之类的服务端秘密放这里。

如果你暂时不用内购,RevenueCat key 可以留空。模板会保留付费状态入口,但不会因为没有 key 就崩溃。

启动 Web/API

vpr @01mvp/web#dev

默认监听 http://localhost:7001,API 地址是 http://localhost:7001/api

启动 Expo

另开一个终端:

vpr @01mvp/mobile#dev

在 Expo 控制台里选择目标:

  • i:iOS Simulator
  • a:Android Emulator
  • w:Web 预览

如果只想确认页面和 API 调用,先用模拟器或 Web 预览就够。等你要验证登录回跳、RevenueCat、图标、启动页、推送、相册或文件选择,再做 development build。

Expo Go 和 development build

Expo Go 适合早期预览页面,但它不是你的真实 App。它不能完整验证所有原生模块,也不能验证你自己的 App 图标、启动页、Bundle ID、部分深链和推送能力。

Development build 可以理解成「你自己的开发版 App」。它安装在手机或模拟器上,原生层属于你的项目,JS 层仍然可以通过 Expo 开发服务器热更新。

场景先用什么
看页面、调普通 API、改文案Expo Go / simulator / web preview
验证 app.json 里的图标、启动页、schemeDevelopment build
接 RevenueCat、推送、相机、文件、WidgetDevelopment build
给团队或早期用户试用Preview build
准备上架商店Production build

真机调试

真机不能访问你电脑上的 localhost。换成设备能访问到的地址:

  • 同一局域网内的 Mac IP,例如 http://192.168.1.20:7001/api
  • Android Emulator 可以用 http://10.0.2.2:7001/api
  • HTTPS tunnel,例如 https://your-dev-domain.ngrok-free.app/api

改完 .env.local 后重启 Expo 才生效。

如果你用 OAuth 或 magic link,优先用 HTTPS tunnel。很多登录回调、cookie 和浏览器安全策略在纯局域网 HTTP 下表现会和线上不同。

第一次安装开发版 App

当 Expo Go 不够用时,先生成 development build:

vpr @01mvp/mobile#eas:build:development

这个脚本等价于在移动端包里执行 eas build --profile development --platform all。首次运行会让你登录 Expo,并按平台准备签名。iOS 真机通常需要付费 Apple Developer 账号;Android 模拟器和设备门槛低一些。

构建完成后,你可以从 EAS 控制台或命令行提示里的链接下载安装。安装后再启动开发服务器:

vpr @01mvp/mobile#dev

然后用开发版 App 打开 Expo 里的项目。以后只改 JS、样式、页面文案时,不需要每次重做原生构建;新增原生依赖、修改插件、权限、scheme、图标、启动页时才需要重新 build。

给别人下载试用

团队内测或给少量朋友试用,用 preview build:

vpr @01mvp/mobile#eas:build:preview

preview profile 是 internal distribution。Android 会生成可直接安装的 APK;iOS 走 Ad Hoc 或企业分发,通常要把测试设备登记进 Apple Developer 账号。构建完成后,EAS 会提供下载链接或二维码。

不要把 preview build 当成正式上架。它适合收集反馈,production build 才进入商店提交路径。

验证

先跑类型检查:

vpr @01mvp/mobile#type-check

再跑 web bundle 构建烟测:

vpr @01mvp/mobile#build

这只是 Web bundle 烟测,不等于 iOS / Android 原生包验证。准备给人下载前,至少再跑一次 preview build,并在真机走完登录、受保护 API、会员状态和核心页面。

卡住时先看这几处

问题先检查
App 请求不到 APIEXPO_PUBLIC_SERVER_URL 是否能从当前设备访问
登录回跳失败EXPO_PUBLIC_APP_SCHEME 是否和 app.jsonexpo.scheme 一致
登录后状态丢失EXPO_PUBLIC_AUTH_COOKIE_PREFIX 是否和服务端 cookie prefix 对齐
付费状态为空RevenueCat public key 和 entitlement 是否已配置
真机能打开但模拟器不行URL、平台 profile 和 development build 类型是否混用

官方参考

这篇文档有问题?