Skip to content

feat: fix iOS builds installable using AltStore Classic/SideStore#28

Open
kubo6472 wants to merge 2 commits into
floatyfp:releasefrom
tojemoc:cursor/restore-upstream-workflow-36bd
Open

feat: fix iOS builds installable using AltStore Classic/SideStore#28
kubo6472 wants to merge 2 commits into
floatyfp:releasefrom
tojemoc:cursor/restore-upstream-workflow-36bd

Conversation

@kubo6472
Copy link
Copy Markdown

@kubo6472 kubo6472 commented Jun 3, 2026

Summary

Single squashed commit on top of upstream release that makes Floaty launch on iOS and distribute via SideStore/AltStore, while keeping upstream’s full multi-platform CI and deploy flow intact.


Runtime changes (why the app white-screened on iOS)

Router / startup (tojemoc#10)

  • lib/app/flavor_theme.dart — moved flavorPrimary out of main.dart to break a circular import
  • lib/features/router/views/splash_screen.dart — extracted splash UI out of main.dart (same cycle fix)
  • lib/main.dart — removed main ↔ router import cycle; registers UpdaterController earlier; uses safe connectivity helpers
  • lib/features/router/controllers/router.dart — wraps auth/connectivity in error handling; uses safeCheckConnectivity() so redirect never hangs forever
  • lib/shared/utils/safe_connectivity.dart — catches connectivity_plus failures instead of aborting GoRouter redirect (blank screen)
  • lib/features/updater/respositories/updater_controllers.dart — 5s Dio timeouts + non-blocking redirectPathIfUpdateRequired() so a slow/failed floaty.fyi update check cannot block navigation

Why: Release iOS builds could fail silently due to the import cycle, and GoRouter’s redirect could hang indefinitely waiting on connectivity or the update API — both manifest as a white screen.

Mobile init blockers (tojemoc#12)

  • lib/features/download/controllers/fp_download_service.dartAndroid-only external storage; iOS uses getApplicationSupportDirectory() for the offline library
  • lib/features/player/controllers/media_player_service.dart — guards platform-specific init
  • lib/features/discordrpc/controllers/* — platform stubs so Discord RPC cannot crash mobile startup
  • lib/shared/utils/platform_info_*.dart — platform detection helpers
  • lib/features/logs/repositories/log_service.dart + log_screen.dart — remote debug log reporting for future mobile issues
  • docs/remote-debug-logging.md — how to use remote logging
  • Tests for download storage selection and log UI

Why: The old code called getExternalStorageDirectory() on iOS (Android API). It returns null on iOS, offline init failed, and the app never finished starting.

Linux (bundled fix)

  • linux/packaging/appimage/AppRun — removes ${LD_LIBRARY_PATH}:${LD_LIBRARY_PATH} self-duplication

CI / distribution changes

Restored upstream workflow

  • .github/workflows/debugbuild.yml — full upstream pipeline restored: VERSION_BUMP → Linux / Android / Windows / macOS+iOS → DEPLOY
  • Triggers on all branches (**), standard GitHub runners everywhere except Android (Blacksmith, as upstream)
  • DEPLOY unchanged in spirit: manifest.json, floaty.fyi API upload, GitHub Release

iOS build fixes (in MACOSIOS)

  • Explicit --build-name / --build-number on flutter build ios
  • scripts/package-ios-ipa-for-sidestore.sh — repackages .app → SideStore/AltStore-friendly .ipa (Payload/ at zip root, ad-hoc codesign)
  • IPA layout verification step (catches bad zips before upload)

Why: Upstream’s simple zip Payload/ produced IPAs that SideStore rejected (NSCocoaError 513). Ad-hoc codesign is required for sideloading unsigned CI builds.

AltStore source (in DEPLOY)

  • scripts/generate-altstore-source.py — builds docs/altstore-source.json from all GitHub Releases (incl. pre-releases); waits for new release IPA to appear in GitHub API before regenerating
  • docs/altstore-source.meta.json — static app metadata
  • docs/altstore-source.json — seed file; CI updates after each iOS deploy
  • Commits source with --no-bump so it doesn’t re-trigger version bump

Why: SideStore users add one source URL and get all builds. Upstream can link to this file from floaty.fyi.


Intentionally not included

Excluded Reason
OTA install flow (manifest.plist, index.html, GitHub Pages) Requires signed Ad Hoc IPAs + registered UDIDs; didn’t work with --no-codesign CI builds
AGENTS.md Cursor Cloud VM instructions; not upstream material
iOS-only CI / Blacksmith-on-everything / main-only triggers Fork iteration hacks; reverted to upstream-style for minimal diff

README

  • Replaced OTA tester instructions with a short SideStore/AltStore section pointing at docs/altstore-source.json

How to verify

  1. Launch — app reaches login/home on iOS (no white screen)
  2. CI — full platform matrix builds; deploy + GitHub Release succeed
  3. SideStore — IPA from release installs
  4. AltStore sourcedocs/altstore-source.json updates after deploy with the new build

@kubo6472 kubo6472 changed the title _ feat: fix iOS builds installable using AltStore Classic/SideStore Jun 3, 2026
Runtime:
- Fix main.dart/router.dart import cycle and GoRouter redirect blocking
- Use app support storage on iOS (Android-only external storage)
- Safe connectivity checks, update API timeouts, mobile init guards
- Remote debug logging for future mobile diagnostics

CI (upstream-compatible):
- Restore full multi-platform debugbuild workflow
- SideStore IPA packaging in MACOSIOS
- AltStore source generation in DEPLOY (docs/altstore-source.json)
- Drop fork-only OTA GitHub Pages flow

Co-authored-by: Jakub Doboš <kubo6472@users.noreply.github.com>
@cursor cursor Bot force-pushed the cursor/restore-upstream-workflow-36bd branch from fbebf8b to 95bee91 Compare June 3, 2026 08:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants