Overview
Smart Fleet Mobile Apps are two iPhone apps for the Smart Fleet SaaS vehicle rental and tracking website: Smart Fleet Customer for the people who rent from your owners and Smart Fleet Driver for your drivers. Owners, managers and the super admin keep using the website. The apps talk only to your website, so all data stays on your server.
What is in the package
| App | Folder | Package name | For |
|---|---|---|---|
| Smart Fleet Customer | iphone_app/ in the customer zip | com.smartfleet.customerApp | Your owners' customers (users of type client) |
| Smart Fleet Driver | iphone_app/ in the driver zip | com.smartfleet.driverApp | Drivers (users of type driver) |
Inside each folder:
| Folder / file | What it is |
|---|---|
lib/ | The app's source code (Flutter / Dart): api.dart, config.dart, theme.dart, widgets.dart, push.dart and screens/. |
ios/ | The iPhone project, already set up (permissions, icons, signing hooks). |
assets/ | icon.png and icon_foreground.png (app icon), logo.png and mark.png (shown before sign-in). |
test/, tool/ | Automated tests and the script that makes store screenshots. |
docs/openapi.yaml | The website API the app uses (for developers who want to extend it). docs/screenshots/ has sample pictures. |
pubspec.yaml | App version and the list of libraries. |
documentation/ | This guide. |
Features
Smart Fleet Customer
| Area | What the customer can do |
|---|---|
| Home | Welcome text and banner of the owner, "your trip right now" or next trip, quick buttons and the owner's call / WhatsApp / email buttons. |
| Vehicles | List of the owner's vehicles with photos and rates. Search by name, model, colour or plate. Pick a date range to see only the vehicles that are free (marked Available). Save favourites with the heart. |
| Vehicle & request | Photos, features, price per day / week / month. Live price for the chosen dates, then send the booking request with pick-up and drop-off address and travellers. |
| My trips | Bookings and requests with status. Pay online (opens the owner's secure payment page, already signed in), cancel inside the free-cancellation window, rate a finished trip. |
| Trip details | Progress timeline, route with directions, your driver with call button, vehicle, payment and balance, trip log (distance, fuel), rental agreement, invoice, and a live tracking link you can share. |
| Statement | Totals paid and due and every booking with its balance. |
| Documents | Photograph your ID or driving licence and upload it; see when it is approved. |
| Profile | Edit name, phone and address, change password, saved vehicles, contact buttons, sign out. |
| Push | Notifications about requests, confirmations and trips. |
Smart Fleet Driver
| Area | What the driver can do |
|---|---|
| Today | Current trip, trips of the day and upcoming trips; the assigned vehicle with its daily check. |
| Trip | Progress, route with navigate buttons (opens the maps app), customer with call, notes, vehicle, readings. |
| Start & finish | Odometer, fuel level, checklist and up to 4 photos at start and at finish. Distance is calculated for you. |
| GPS sharing | While a trip runs the app shares the position with the office and the customer's live link, also when the app is in the background (a notification is shown). It stops when the trip ends. |
| Expenses | Log fuel (litres, amount, odometer) and expenses (toll, parking, wash …) with a receipt photo; list of recent entries. |
| Report | Report a breakdown, damage, accident or SOS with photos; the office is told straight away with your position, and replies show in the app. |
| Trips & profile | Finished trips, edit profile and password, contact buttons. |
| Offline | Fuel, expenses and reports are saved on the phone when there is no signal and sent automatically when it returns. |
| Push | Notifications when the office assigns or changes a trip. |
Common to both
- Sign-in with email and password.
- App code or QR code sign-in with the owner's name, logo and colours.
- Before sign-in the app shows the Smart Fleet (system) logo and name; after sign-in it shows the owner's.
- Update-required and maintenance screens controlled from the website.
Requirements
Your computer (to build the app)
| Item | Needed |
|---|---|
| System | A Mac with a recent macOS (iPhone apps can only be built with Xcode) |
| Xcode | Latest stable version from the Mac App Store, with the command-line tools |
| Flutter SDK | Stable channel, Dart 3.3 or newer |
| CocoaPods | sudo gem install cocoapods (or Homebrew) |
Phones that can run the app
iPhone with iOS 15 or newer.
Accounts
- Apple Developer Program membership (yearly fee) to run on a real iPhone for more than a week and to publish.
- Firebase project (free) for push notifications, and an APNs key from Apple.
Website
Smart Fleet SaaS v2.0 or newer on HTTPS, with the migrations run (php artisan migrate).
Install Xcode & Flutter
- Install Xcode from the Mac App Store, open it once and accept the licence. Then:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer sudo xcodebuild -runFirstLaunch - Install Flutter from docs.flutter.dev and CocoaPods.
- Check everything:
Flutter and Xcode should show green ticks.flutter doctor
Prepare the website
- Update the website to Smart Fleet SaaS v2.0 or newer and run
php artisan migrate. This adds the tables the apps need (device tokens, app settings). - Make sure the site opens on HTTPS and
APP_URLin.envis the real address. - As super admin, open Mobile App Console: set the latest and minimum app version, the four store links (customer and driver, Google Play and App Store), maintenance mode, the features that are on and the Firebase key for push. You can also switch the apps off completely.
- As owner, open Mobile Web App (menu): your app code, logo, colours, welcome text, contact buttons, which tabs customers see, and the QR code to print or share. The same code and QR also appear on your public website.
- For photos: set
upload_max_filesize = 12Mandpost_max_size = 40Minphp.ini(a driver request can carry several photos).
Open the project
Unlike a bare Flutter source package, the iPhone project is already included, so there is no setup script. Unzip, then in the app folder:
cd iphone_app
flutter pub get
The identifiers are com.smartfleet.customerApp (customer) and com.smartfleet.driverApp (driver). Change them to your own before you publish:
- Xcode → Runner → Signing & Capabilities → Bundle Identifier (
Runnertarget andRunnerTeststarget) - The app name under the icon:
CFBundleDisplayNameinios/Runner/Info.plist
Point the app at your website
Give the website address when you build; it is then fixed in the app. The address ends with /api/v2:
flutter run --dart-define=API_BASE=https://your-domain.com/api/v2
To build an app for one owner only (the code screen is skipped), add that owner's app code:
flutter run --dart-define=API_BASE=https://your-domain.com/api/v2 --dart-define=COMPANY=AB12CDRun on an iPhone or simulator
Xcode signing
- Run
flutter pub get, thencd ios && pod install. - Open
ios/Runner.xcworkspace(not the .xcodeproj) in Xcode. - Select Runner → Signing & Capabilities, tick Automatically manage signing, choose your Team and set your own Bundle Identifier.
- Add the capabilities Push Notifications and Background Modes → Remote notifications (driver app: also Location updates).
Simulator
open -a Simulator
flutter run --dart-define=API_BASE=https://your-domain.com/api/v2
Camera and push notifications do not work in the simulator.
Your iPhone
Connect it, trust the computer, turn on Developer Mode (Settings → Privacy & Security) and run flutter run. The first time, trust your developer certificate under Settings → General → VPN & Device Management.
Testing against a local website (http)
Debug builds accept plain http:// (use your Mac's address, for example http://192.168.1.20/…). Release builds require HTTPS.
Company code & branding
Changes that need no new build (from the website)
| What | Where |
|---|---|
| Owner name, logo, colours, light / dark, welcome title and text, banner, contact buttons | Owner → Mobile Web App. The app shows them after sign-in (the sign-in screen itself keeps the Smart Fleet logo and name). |
| App code and QR code | Same page. The QR code can be printed or sent; scanning it fills in the code in both apps. |
| Which tabs the customer sees | Same page (Home, Vehicles, My trips, Documents, Profile; at least two). |
| Store links, latest and minimum version, maintenance, features on / off, Firebase key | Super admin → Mobile App Console |
| System logo and name shown before sign-in | Super admin → system settings (logo, favicon, title) |
The app sends X-App-Version; the website answers 426 update_required below the minimum version, 503 maintenance during maintenance and 403 when the apps are switched off.
Changes in the code (then build again)
- App icon: replace
assets/icon.pngandassets/icon_foreground.png, thendart run flutter_launcher_icons. - Logo and mark before sign-in:
assets/logo.pngandassets/mark.png. - Default colours:
lib/theme.dart(used until an owner is chosen). - App name under the icon:
CFBundleDisplayNameinInfo.plist.
Push notifications (Firebase + APNs)
Optional. Without it everything works; only the phone pop-ups are missing.
- Create a project in the Firebase console and add two iOS apps with the bundle identifiers of the Customer and Driver apps.
- Download each
GoogleService-Info.plistand add it toios/Runner/in Xcode (tick Copy items if needed and the Runner target). - In Apple Developer create an APNs Auth Key (.p8) and upload it in Firebase → Project settings → Cloud Messaging → Apple app configuration.
- On the website: Firebase console → Project settings → Service accounts → Generate new private key. As super admin open Mobile App Console and paste the whole JSON file into Firebase service-account JSON.
- In Xcode add Push Notifications and Background Modes → Remote notifications, build again and sign in once.
When users are notified
A push is sent for booking request updates, confirmations, trip start and finish (customers) and for trips assigned or changed by the office (drivers).
Version numbers
Set the version in pubspec.yaml: version: 1.0.0+1. 1.0.0 is the version people see; +1 is the build number. Increase the build number for every upload to App Store Connect. Also set the same number in lib/config.dart (appVersion) and raise Latest version in Mobile App Console.
Create the app in App Store Connect
- Apple Developer → Identifiers: register your bundle identifiers (or let Xcode do it).
- App Store Connect → Apps → + → New App. Choose the bundle identifier, name (Smart Fleet Customer / Smart Fleet Driver or your own), language and a SKU.
Build & upload
flutter build ipa --release --dart-define=API_BASE=https://your-domain.com/api/v2
Then open build/ios/archive/Runner.xcarchive in Xcode (Window → Organizer) and choose Distribute App → App Store Connect → Upload, or use the Transporter app with the .ipa. Do this for both apps.
TestFlight (beta testing)
After processing, the build appears in App Store Connect → TestFlight. Add internal testers (up to 100, no review) or external testers (short Apple review).
Publish on the App Store
- App information & pricing: category (Travel or Business), privacy policy URL, price (free).
- App Privacy: describe the data the app collects (see Privacy & data safety).
- Version page: description, keywords, support URL, screenshots (6.9" and 6.5" sizes;
tool/screenshots.shmakes sample pictures) and select the uploaded build. - App Review information: give a demo account (a client for the Customer app, a driver for the Driver app) and the app code, so the reviewer can sign in.
- Submit for review.
Common rejection reasons and how to avoid them
- Reviewer cannot sign in: always provide a working demo account and app code.
- Missing privacy text: every permission has a description in
Info.plist; keep them accurate. - Payments: rentals are a real-world service paid on the owner's secure web page, which Apple allows.
- Background location (driver app): explain in the review notes that the position is shared only during a running trip.
Privacy & data safety
You publish the apps, so you are responsible for the store forms. What the apps handle:
| Data | Why |
|---|---|
| Name, email, phone, address | Account and booking contact details |
| Photos of ID / licence (Customer) | Rental verification, uploaded to your website and visible only to the owner's staff |
| Location (Driver only) | Share the vehicle position with the office and the customer while a trip runs, including in the background; stops when the trip ends |
| Photos (Driver) | Vehicle condition, receipts and problem reports sent to the office |
| Device push token | Send notifications |
All data is sent to your website over HTTPS. The apps contain no ads and no third-party analytics. Users can ask the owner to delete their data.
iPhone permissions used
| Key in Info.plist | App | Text shown |
|---|---|---|
NSCameraUsageDescription | Both | Photos of documents, vehicle and receipts; QR scan |
NSPhotoLibraryUsageDescription | Both | Choose photos to attach |
NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription | Driver | Share the position during a trip, also in the background |
Code structure
lib/
main.dart, config.dart start-up, server address and app version
api.dart the API client (token, errors, uploads)
push.dart Firebase push (does nothing until Firebase is set up)
theme.dart, widgets.dart colours and shared pieces
format.dart dates and money
screens/ every screen (sign-in, home tabs, trip, vehicles, expenses ...)
tracking.dart, offline_queue.dart driver app only: GPS sharing and the no-signal queue
test/ unit and screen tests (run offline with a fake server)
tool/ screenshots for the stores (tool/screenshots.sh)
docs/ API list (openapi.yaml) and screenshots
Run the tests with flutter test and the checks with flutter analyze.
Updating to a new version
- Update the website first (apps work with a website of the same or a newer version).
- Back up your own changes, unzip the new package and copy your changes back (
lib/, icon, package name, bundle identifier,GoogleService-Info.plist). - Run
flutter pub get, raise the build number and build again.
Troubleshooting
| Problem | What to do |
|---|---|
| "We could not find that code" | Check the app code on the owner's Mobile Web App page, and that the website is reachable on HTTPS from the phone. |
| "Could not reach the server" / "You are offline" | Check API_BASE (it must end with /api/v2), the SSL certificate and that the address opens in the phone's browser. Debug builds may use http://, release builds need HTTPS. |
| "Update required" / "Maintenance" | Super admin → Mobile App Console: lower the minimum version, or turn maintenance off. |
| Apps are switched off | Super admin → Mobile App Console → App is live. |
| No vehicles shown | The owner must tick Show on website for a vehicle (Website Vehicles). |
| Photos fail to upload | Raise upload_max_filesize and post_max_size in php.ini. |
| No push notifications | Check the Firebase key in Mobile App Console and GoogleService-Info.plist and the APNs key in the app; sign in again on the phone. |
| Driver position is not updated | Allow location all the time for the Driver app and do not stop the app from running in the background (battery saver). |
| Website error 500 after update | Run php artisan migrate on the website. |
flutter pub get fails | Update Flutter (flutter upgrade) so a recent Dart is installed. |
| Xcode signing errors | Choose your Team and a unique Bundle Identifier in Signing & Capabilities; run pod install again. |
FAQ
Do I need to publish a separate app for each owner?
No. One build of each app serves every owner; people choose theirs with the app code or QR code.
Can the apps work without the website?
No. They are companions to the Smart Fleet SaaS website and use its API.
Can I publish the apps under my own name?
Yes: your package name, app name, icon and store account.
Do I need a Mac?
Yes. Apple only allows iPhone apps to be built with Xcode on a Mac.
Is a payment taken inside the app?
No. The app opens the owner's secure payment page in the browser; card data never passes through the app.
Is there a version without the Smart Fleet logo?
The logo shown before sign-in comes from assets/logo.png and assets/mark.png and the system logo of your website. Replace them with your own.
Support & changelog
Before contacting support, check Troubleshooting and run flutter doctor -v.
When you contact support, include: your purchase code, the app version (pubspec.yaml) and website version, the output of flutter doctor -v, the exact error message or a screenshot, and what you did just before the problem.
Support covers installation questions, bugs and help with the steps in this guide. Customisations (new features, design changes) are not included but can be ordered separately.
Changelog
| Version | Date | Changes |
|---|---|---|
| 1.0.0 | October 2026 | First release: Smart Fleet Customer and Smart Fleet Driver apps. Vehicle search and availability, booking requests, trip details, online payment, live tracking, statement, document upload, driver trips with start / finish, GPS sharing, fuel and expenses, daily check, problem and SOS reports, offline saving for the driver, push notifications, app code / QR sign-in with the owner's branding. |