تخطي إلى المحتوى الرئيسي

iOS mobile client

Native Swift + SwiftUI app in ios-app/.

Auth and API

MechanismDetail
RESTSame /api/* routes as web (server.ts, lib/walletTransportRoutes.ts)
SessionCookie omnitrack.sid via HTTPCookieStorage + persisted cookie lines in UserDefaults
RealtimeSocket.io /socket.io (session cookie in extraHeaders; no Bearer JWT)
Client headerX-OmniTrack-Client: ios
RoutingGET /api/routing/drive via RoutingRepository / OsrmClient.swift

Wallet / Mollie

POST /api/wallet/top-up/mollie accepts optional body field redirectUrl (base deep link, e.g. omnitransitiq://wallet). Server appends ?walletIntent=<id>.

Fallback when header is ios and no redirectUrl: env MOBILE_WALLET_REDIRECT_SCHEME (default omnitransitiq://wallet).

Checkout opens in SFSafariViewController; return via URL scheme registered in Info.plist.

Roles and UI (native iOS)

RoleShell
driverModern sidebar sheet (DriverShell.swift), default Home
OthersHome default + OmniSidebarModern sheet (DashboardShell.swift)

Post-login chrome (Android parity):

  • OmniSidebarModern + OmniAppTopBar in CommonUI.swift
  • Thin SF Symbol icons via OmniIcons.swift
  • HomeScreen.swift — stats + quick actions
  • RoutePlannerScreen.swift + NavigationMode.swift — in-app navigation (no Apple Maps redirect)
  • Map — Carto Positron Light Resources/map-style.json

Nav visibility follows the same rules as web (src/App.tsx) and Android (Authz.swift).

i18n

Locales in ios-app/OmniTrack/Resources/locales/, synced from src/locales/*.json via ios-app/scripts/sync-locales.mjs. Home keys: dashboard.home*; navigation: nav.*.

Local dev

  1. docker compose up on host (port 3000)
  2. Simulator: http://localhost:3000 in login advanced settings
  3. Physical device: Mac LAN IP

Project generation

Xcode project is generated from ios-app/project.yml via XcodeGen:

cd ios-app && xcodegen generate && open OmniTrack.xcodeproj

App Store compliance

RequirementImplementation
Privacy manifestOmniTrack/PrivacyInfo.xcprivacy
In-app privacy + deletion URLsOmniSidebarModern in CommonUI.swift
Account deletionDELETE /api/auth/me via AppViewModel.deleteMyAccount()
Encryption declarationITSAppUsesNonExemptEncryption = false
Usage descriptionsLocation (map + in-app navigation), photo library, camera in Info.plist
Release demo logins hiddenAppConfig.hideDemoLogins (#if DEBUG)
Review accountdemo@demo.be / test123! — see APP-STORE-SETUP.md

CI

Optional workflow: .github/workflows/ios-app.yml (macOS + xcodebuild).

References