GeoLibre移动端构建指南:Tauri v2打包Android AAB与iOS IPA完整教程
【免费下载链接】GeoLibreA lightweight, cloud-native GIS platform for visualizing, exploring, and analyzing geospatial data. It runs in the web browser, on the desktop, on mobile, and inside Jupyter notebooks.项目地址: https://gitcode.com/GitHub_Trending/ge/GeoLibre
GeoLibre 是一款轻量级云原生 GIS 平台,可以在浏览器、桌面端、Jupyter 和移动端中可视化、探索与分析地理空间数据。本文基于 Tauri v2 Mobile,手把手带你把 GeoLibre 打包成 Android 应用(AAB)和 iOS 应用(IPA)——无需维护第二套代码,同一份 React 代码库即可产出双端原生应用。
📱 为什么 GeoLibre 选择 Tauri v2 打包移动端
Tauri v2 将 WebView 界面直接打包进 APK/IPA,应用外壳离线可用,地图瓦片与重型引擎(如 WebAssembly 地理处理工具)按需加载,与桌面版行为一致。
移动端保留了完整地图工作台、数据添加、Whitebox 地理处理工具箱(1000+ 工具)、SQL 工作区(DuckDB-WASM + PGlite/PostGIS)、Python 控制台(Pyodide)、AI 助手与故事地图。仅依赖本地桌面进程的功能(Python sidecar 栅格处理、本地 PostgreSQL 等)会在移动端自动隐藏。
💡 详细功能对照见 docs/android.md 与 docs/ios.md
⚙️ Android 工具链:一次性配置(JDK + SDK + NDK)
构建 GeoLibre 的 Android AAB 需要三件套:JDK 17/21、Android SDK + NDK、Rust Android 目标。
首先克隆代码仓库:
git clone https://gitcode.com/GitHub_Trending/ge/GeoLibre cd GeoLibre然后配置环境(全部放在用户可写的~/Android/Sdk,无需 root):
export JAVA_HOME=/path/to/jdk-21 export ANDROID_HOME="$HOME/Android/Sdk" yes | sdkmanager --sdk_root="$ANDROID_HOME" --licenses sdkmanager --sdk_root="$ANDROID_HOME" \ "platform-tools" "platforms;android-36" \ "build-tools;36.0.0" "ndk;27.3.13750724" export NDK_HOME="$ANDROID_HOME/ndk/27.3.13750724" # Tauri 需要 NDK_HOME rustup target add aarch64-linux-android armv7-linux-androideabi \ i686-linux-android x86_64-linux-android两个关键版本约束,记牢即可避免 80% 的构建失败:
| 组件 | 要求版本 | 原因 |
|---|---|---|
| API 级别 | 36(Android 16) | Tauri v2.11 模板生成compileSdk = 36,且 2026-08-31 起 Google Play 的最低门槛 |
| NDK | r27 LTS | Tauri v2 的官方支持线 |
⚠️ 必配:16 KB 内存页对齐(Play 审核硬门槛)
Google Play 会拒绝目标 Android 15+ 且原生库未按 16 KB 内存页对齐的应用。NDK r27 不会自动对齐,必须通过RUSTFLAGS环境变量显式传入(写进.cargo/config.toml会被 Tauri CLI 静默忽略,这是最常见的踩坑点):
export RUSTFLAGS="-C link-arg=-Wl,-z,max-page-size=16384 -C link-arg=-Wl,-z,common-page-size=16384"📦 构建 Android 发布包:一键生成 AAB
在apps/geolibre-desktop目录下执行:
npx tauri android init # 首次:生成 src-tauri/gen/android npx tauri android build --aab # 生成 Google Play 用的通用 AAB产出位置速查:
| 构建目标 | 命令 | 产出与用途 |
|---|---|---|
| 通用AAB | build --aab | Google Play 上传格式(Play 会自动按设备拆分) |
| 分架构APK | build --apk --split-per-abi | 侧载安装,每架构约 40 MB(arm64用于真机) |
几点实用建议:
- 务必构建 release 版本:release 的 APK 约 40 MB/架构;debug 构建因含未裁剪的
.so会膨胀到约 200 MB。 - AAB 不要加
--split-per-abi——Play 只要一个通用 bundle。 - 应用名(GeoLibre)与包名(
org.geolibre.app)在 apps/geolibre-desktop/src-tauri/tauri.android.conf.json 中独立配置,刻意与桌面版的org.geolibre.desktop区分,避免影响桌面用户的设置目录与 Linux/macOS 打包。
🔐 给 APK 签名(发布前必做)
tauri android build产出的是未签名包。侧载安装或分发自建 APK 时需先 16 KB 对齐、再签名:
BT="$ANDROID_HOME/build-tools/36.0.0" "$BT/zipalign" -P 16 -f 4 app-arm64-release-unsigned.apk aligned.apk "$BT/apksigner" sign --ks "$HOME/.android/debug.keystore" \ --ks-pass pass:android --ks-key-alias androiddebugkey \ --key-pass pass:android --out geolibre-arm64.apk aligned.apk "$BT/apksigner" verify geolibre-arm64.apk正式发布建议自建上传密钥:keytool -genkeypair -v -keystore upload.jks -alias upload -keyalg RSA -keysize 2048 -validity 10000。
🍎 iOS 打包:只在 Mac 上构建 IPA
iOS无法从 Linux 交叉编译,必须在 Mac 上完成。一次配置工具链:
xcode-select --install # 命令行工具 sudo xcodebuild -license accept # 首次打开 Xcode 接受许可 brew install cocoapods rustup target add aarch64-apple-ios aarch64-apple-ios-sim x86_64-apple-ios其中aarch64-apple-ios对应真机与 App Store IPA,aarch64-apple-ios-sim对应 Apple Silicon Mac 的模拟器。
📍 位置权限字符串(iOS 特有的"必配项")
与 Android 不同,iOS 在没有任何位置用途说明字符串时会直接终止应用。GeoLibre 在 apps/geolibre-desktop/src-tauri/Info.ios.plist 中声明了NSLocationWhenInUseUsageDescription,构建时自动合并进生成的Info.plist,覆盖野外采集、GPS 轨迹与地图定位三个场景。
📱 最低系统版本:iOS 15.0
最低版本在 apps/geolibre-desktop/src-tauri/tauri.ios.conf.json 中一行设定:
"bundle": { "iOS": { "minimumSystemVersion": "15.0" } }不配置时 Tauri CLI 默认值为 14.0,低于 Apple 的最低门槛(App Store Connect 会发ITMS-90068警告,2027 春季后直接拒收)。
📦 构建并导出 App Store IPA
cd apps/geolibre-desktop npx tauri ios init # 首次:生成 src-tauri/gen/apple npx tauri ios dev # 模拟器/真机调试 npx tauri ios build --no-sign # 无签名 archive(无需 Apple 账号)⚠️避坑:
tauri ios build --export-method app-store-connect无法直接出包——生成的工程把CODE_SIGN_IDENTITY = "iPhone Developer"写死在配置里,自动签名会去找开发描述文件而失败。正确姿势是先无签名归档,再用xcodebuild -exportArchive做分发签名,Xcode 会自动创建 Apple Distribution 证书与 App Store 描述文件:
G=src-tauri/gen/apple # 写入 ExportOptions-appstore.plist:method=app-store-connect、teamID=你的TeamID、signingStyle=automatic xcodebuild -exportArchive -allowProvisioningUpdates \ -archivePath "$G/build/geolibre-desktop_iOS.xcarchive" \ -exportOptionsPlist "$G/ExportOptions-appstore.plist" \ -exportPath "$G/build/appstore"产物build/appstore/GeoLibre.ipa即为可提交 App Store 的包:Apple Distribution 签名、get-task-allow=false、内嵌 App Store 描述文件。上传前用codesign -dvvv验证签名。
🚀 CI 自动化:一键产出签名的 AAB 与 IPA
GeoLibre 的 CI 工作流已把整条签名-归档管线固化下来,本地打包前可先参考:
- .github/workflows/android.yml:构建签名后的分架构 APK 与通用 AAB;配置
ANDROID_KEYSTORE_BASE64等 4 个 secrets 后使用真实发布密钥签名,否则回退到调试密钥(调试签名包仅供测试,Play 拒收)。 - .github/workflows/ios.yml:在
macos-15Runner(需 Xcode 16+)上执行无签名归档 + 手动签名导出,校验 bundle id、签名与MinimumOSVersion后产出geolibre-ios-ipa工件;配置APPLE_IOS_*四个 secrets(证书、密码、描述文件、Team ID)即可全自动化。
💡 CI 会用递增的运行号为 iOS 包自动盖章
CFBundleVersion——App Store 要求每次上传的构建号必须严格大于上一次,这是发布时最容易卡住的细节之一。
❓ 常见问题速查
| 问题 | 解答 |
|---|---|
| AAB 能直接装到手机上吗? | ❌ 不能。AAB 是 Google Play 专属上传格式,侧载请用分架构 APK |
| 换了签名密钥后装不上新包? | 先adb uninstall org.geolibre.app再安装——Android 拒绝签名不一致的覆盖更新 |
security find-identity列表为空,是不是签名失败? | 未必。Cloud Managed 证书不出现在该列表中,直接检查.ipa的签名 |
| 桌面端和移动端包名冲突吗? | 不冲突。移动端统一org.geolibre.app,桌面端保持org.geolibre.desktop |
| GeoLibre 会发布可侧载的 IPA 吗? | 不会。iOS 通过 App Store 与 TestFlight 分发,发布包中的 IPA 仅作提交存档 |
📚 延伸阅读
- Android 完整构建文档(含模拟器测试与 Play 上架清单):docs/android.md
- iOS 完整构建文档(含签名密钥管理与 TestFlight 流程):docs/ios.md
- 移动端功能差异与已知限制说明:见上述两篇文档的Known limitations章节
按本文流程操作,你只需几行命令就能把 GeoLibre 这个完整的移动端 GIS 工作台送上 Google Play 与 App Store——工具链配置一次到位后,后续每次发版只需构建、签名、上传三步。
【免费下载链接】GeoLibreA lightweight, cloud-native GIS platform for visualizing, exploring, and analyzing geospatial data. It runs in the web browser, on the desktop, on mobile, and inside Jupyter notebooks.项目地址: https://gitcode.com/GitHub_Trending/ge/GeoLibre
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考