You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Expo托管工作流构建无需发布/托管资源的离线APK?

构建完全离线的Expo托管工作流应用

当然可以实现完全离线的Expo应用,不需要依赖Expo服务器的manifest.json,也不用执行expo publish。下面是具体的步骤和配置要点:

1. 修改app.json配置,强制本地资源打包与离线优先

在项目根目录的app.json中,调整expo字段下的相关配置,让应用完全依赖本地资源:

{
  "expo": {
    // ...保留你的其他基础配置
    "assetBundlePatterns": ["**/*"],
    "updates": {
      "enabled": false,
      "fallbackToCacheTimeout": 0
    }
  }
}
  • assetBundlePatterns: 设置为["**/*"]会告诉Expo把项目中所有本地资源(图片、SVG、TTF等)都打包到最终的独立应用安装包中,彻底告别远程资源依赖。
  • updates.enabled: 设为false直接禁用OTA更新功能,应用启动时不会再去请求Expo服务器的manifest.json
  • fallbackToCacheTimeout: 设为0确保应用完全使用本地缓存的资源,不会尝试联网获取任何更新内容。

2. 确保所有资源均为本地引用

检查你的代码,把所有静态资源改成本地导入,绝对不要用远程URL:

  • 图片/SVG:用require('./assets/images/your-icon.svg')或ES模块import HeroImage from './assets/images/hero.png'引用本地文件。
  • 字体:通过expo-font加载本地字体,示例代码:
import { useFonts } from 'expo-font';

export default function App() {
  const [fontsLoaded] = useFonts({
    'Montserrat-Regular': require('./assets/fonts/Montserrat-Regular.ttf'),
    'Montserrat-Bold': require('./assets/fonts/Montserrat-Bold.ttf'),
  });

  if (!fontsLoaded) {
    return null; // 或者自定义一个加载占位组件
  }

  return <YourAppMainContent />;
}

3. 构建独立离线应用

使用Expo的构建命令生成完整的离线安装包:

  • Android平台:执行expo build:android
  • iOS平台:执行expo build:ios

构建完成后,下载生成的apkipa文件,安装到设备后断网测试——此时应用不会发起任何联网请求,所有资源都从本地安装包中加载。

额外注意事项

  • 排查第三方依赖:部分第三方库可能会偷偷发起联网请求,建议在断网环境下完整测试应用流程,也可以用抓包工具确认没有意外的网络请求。
  • 精简Expo模块:只保留你需要的、离线可用的Expo模块,避免引入需要联网的模块(比如expo-updates已经禁用,若不需要位置服务也可以移除expo-location等)。

内容的提问来源于stack exchange,提问作者Shahid Kamal

火山引擎 最新活动