fix: allow HTTP to local instances in release build; fix activity 404 in dev
Android release builds block cleartext HTTP by default (debug builds override this via the debug manifest overlay). Add usesCleartextTraffic=true to app.json so expo prebuild includes it in the generated manifest — required to reach local Bincio instances over HTTP. In bincio dev (Astro dev server), /activity/<id>/ routes 404 because getStaticPaths() returns [] and there is no nginx try_files fallback. Add a Vite middleware plugin to astro.config.mjs that rewrites /activity/<id>/ to /activity/ in dev, matching what nginx does in production.
This commit is contained in:
+54
-11
@@ -247,21 +247,64 @@ Everything else — the activity files, the extracted BAS JSON — stays on devi
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### Building a standalone APK
|
||||||
|
|
||||||
|
A standalone APK is a **self-contained application binary** that runs without Expo Go and doesn't rely on development servers. Use this to distribute to friends, devices, or the Karoo 2.
|
||||||
|
|
||||||
|
#### Option A: EAS cloud build (recommended, no local tools needed)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install -g eas-cli
|
||||||
|
eas build -p android --profile preview # produces a standalone APK
|
||||||
|
```
|
||||||
|
|
||||||
|
The APK is available for download from the EAS dashboard or via:
|
||||||
|
```bash
|
||||||
|
eas build -p android --profile preview --wait
|
||||||
|
eas artifact download # follow the prompt
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Option B: Local build with prebuild (requires Android Studio)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd mobile
|
||||||
|
npx expo prebuild --clean # generates Android native project
|
||||||
|
cd android
|
||||||
|
./gradlew assembleRelease # builds release APK
|
||||||
|
```
|
||||||
|
|
||||||
|
The APK is at `android/app/build/outputs/apk/release/app-release.apk`.
|
||||||
|
|
||||||
|
**Note:** Release APKs must be signed. If signing fails, use `assembleDebug` instead to produce `app-debug.apk` (same as `npx expo run:android`).
|
||||||
|
|
||||||
|
#### Troubleshooting
|
||||||
|
|
||||||
|
If your friend's APK won't start:
|
||||||
|
|
||||||
|
1. **Check device logs:**
|
||||||
|
```bash
|
||||||
|
adb logcat | grep -i react # requires Android SDK tools
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Ensure minimum Android version:** The app requires Android 5.0 (API 21) or higher.
|
||||||
|
|
||||||
|
3. **Verify the APK is actually installed:**
|
||||||
|
```bash
|
||||||
|
adb install /path/to/app.apk
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### Distributing the app
|
### Distributing the app
|
||||||
|
|
||||||
| Target | Method |
|
| Target | Method |
|
||||||
|---|---|
|
|---|---|
|
||||||
| Your own Android phone | `npx expo run:android` via USB, or EAS development build |
|
| Your own Android phone | `npx expo run:android` via USB, or `eas build --local` |
|
||||||
| Karoo 2 | EAS production build → download APK → sideload via `adb install bincio.apk` or Karoo's app sideloader |
|
| Friends or testing | Standalone APK (release or debug, see above) — no Expo Go needed |
|
||||||
| Other Android users | EAS build → share APK download link (no Play Store needed) |
|
| Karoo 2 | `eas build -p android --profile preview` → sideload via `adb install` |
|
||||||
| Play Store | EAS production build → upload `.aab` to Play Console |
|
| Other Android users | Share the standalone APK download link |
|
||||||
| iOS users | EAS build → TestFlight (beta) or App Store |
|
| Play Store | `eas build -p android --profile preview` → upload `.aab` to Play Console |
|
||||||
|
| iOS users | `eas build -p ios --profile preview` → TestFlight (beta) or App Store |
|
||||||
For Karoo sideloading:
|
|
||||||
```bash
|
|
||||||
eas build -p android --profile preview # produces a standalone APK
|
|
||||||
adb install /path/to/bincio.apk # with Karoo connected via USB
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
"platforms": ["ios", "android"],
|
"platforms": ["ios", "android"],
|
||||||
"android": {
|
"android": {
|
||||||
"package": "org.bincio.app",
|
"package": "org.bincio.app",
|
||||||
|
"usesCleartextTraffic": true,
|
||||||
"permissions": [
|
"permissions": [
|
||||||
"android.permission.READ_EXTERNAL_STORAGE",
|
"android.permission.READ_EXTERNAL_STORAGE",
|
||||||
"android.permission.READ_MEDIA_VIDEO",
|
"android.permission.READ_MEDIA_VIDEO",
|
||||||
|
|||||||
@@ -9,6 +9,20 @@ const env = loadEnv(process.env.NODE_ENV ?? 'development', process.cwd(), '');
|
|||||||
const apiPort = process.env.VITE_API_PORT || '4041';
|
const apiPort = process.env.VITE_API_PORT || '4041';
|
||||||
const serveTarget = env.PUBLIC_EDIT_URL || `http://localhost:${apiPort}`;
|
const serveTarget = env.PUBLIC_EDIT_URL || `http://localhost:${apiPort}`;
|
||||||
|
|
||||||
|
// In production, nginx serves activity/index.html for all /activity/<id>/ URLs
|
||||||
|
// via try_files. In dev (Astro dev server), no nginx — this plugin replicates it.
|
||||||
|
const activityFallbackPlugin = {
|
||||||
|
name: 'activity-shell-fallback',
|
||||||
|
configureServer(server) {
|
||||||
|
server.middlewares.use((req, _res, next) => {
|
||||||
|
if (req.url && /^\/activity\/[^/]+\/?(\?|$)/.test(req.url)) {
|
||||||
|
req.url = '/activity/';
|
||||||
|
}
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
integrations: [svelte(), tailwind()],
|
integrations: [svelte(), tailwind()],
|
||||||
devToolbar: { enabled: false },
|
devToolbar: { enabled: false },
|
||||||
@@ -16,6 +30,7 @@ export default defineConfig({
|
|||||||
// When hosting at a subdirectory (e.g. GitHub Pages project site), set:
|
// When hosting at a subdirectory (e.g. GitHub Pages project site), set:
|
||||||
// base: "/repo-name",
|
// base: "/repo-name",
|
||||||
vite: {
|
vite: {
|
||||||
|
plugins: [activityFallbackPlugin],
|
||||||
optimizeDeps: {
|
optimizeDeps: {
|
||||||
include: ['maplibre-gl'],
|
include: ['maplibre-gl'],
|
||||||
esbuildOptions: { target: 'es2022' },
|
esbuildOptions: { target: 'es2022' },
|
||||||
|
|||||||
Reference in New Issue
Block a user