Developing a Mobile App for a Ski Resort
A ski resort app is not an information brochure. In production it's real-time chairlift status, digital ski pass replacing plastic at turnstiles, GPS tracking of runs with descent analysis, and push notifications when run status changes. Each of these components requires separate technical solutions.
Real-Time Chairlift and Run Status
This is the most critical part from user perspective. A chairlift closes—user should know immediately, not when trying to reach it.
Chairlift status data: most modern rope system management systems (Leitner, Doppelmayr) have API or OPC UA interface. Alternative—parsing existing resort system or manual updates by operators through CMS. Server—polling every 30-60 seconds or webhook on status change.
Delivery to client: WebSocket for online users + FCM/APNs push for background. Status visualized on run map: green (open), red (closed), orange (limited operation), gray (maintenance).
Ski run map—SVG or raster. Interactive SVG map on WebView—simple path, but gestures work poorly. Better: interactive map as native MKMapView/Mapbox with polygon layers for runs (color by difficulty: green/blue/red/black) and icon markers for chairlifts. Data—GeoJSON from resort.
Digital Ski Pass
Ski pass in app instead of plastic card—convenience for guest and cost reduction for resort. Two implementation approaches:
NFC pass. iOS Wallet + PassKit. Resort issues .pkpass file with user data. Turnstile reads NFC via CoreNFC / existing RFID reader if supporting Apple Pay infrastructure. Limitation: iOS Wallet NFC only on iPhone XS+ with iOS 13.4+.
QR pass. More universal: QR code generated on server (signed JWT as QR), valid 24 hours, auto-updates. Turnstile scans QR via any 2D scanner. Implementation: Core Image CIQRCodeGenerator (iOS) or zxing-android-embedded (Android). QR displayed with auto-brightness (screen brightness 100% on display—UIScreen.main.brightness = 1.0).
Integration with resort access control system: Axess, Skidata, Magnetic exist as separate platforms with APIs. Worked out individually.
GPS Run Tracking
Run recording—feature users love. Real-time speed, distance, run count, vertical meters.
High speed (40-80 km/h on descent) requires high GPS point frequency. kCLLocationAccuracyBestForNavigation—maximum accuracy, update every second. Speed from CLLocation.speed (m/s). Auto-detect descent: speed > 5 km/h + downward elevation movement → start recording. Speed < 2 km/h + stop at chairlift → end descent.
Battery: at kCLLocationAccuracyBestForNavigation iPhone loses ~20-25% per hour. Acceptable for ski day (6-8 hours). Android PRIORITY_HIGH_ACCURACY similar consumption.
Run statistics: max speed, average speed, elevation drop, time. Separate card per run, daily summary. Swift Charts—LineMark for speed vs distance.
Booking and Services
Ski-school, rental, restaurant—book directly from app. Standard booking flow: select service → date/time → confirm → payment (Stripe/YooKassa). Push reminder 1 hour before.
Mobile QR for restaurant/rental—shows guest already paid via app. Scanned by staff at checkout.
Timeline
Basic app (run map with real-time status, ski pass QR, run tracking)—6-10 weeks. Full version with booking, NFC Wallet, turnstile system integration—3-5 months. Cost depends on resort management systems (Axess/Skidata/others)—integration requires separate assessment.







