iOS

Job Board SaaS – iPhone App Documentation

App v1.0.0 · needs Job Board SaaS 1.9+

Overview

Job Board Recruiter is the iPhone app for the people who run hiring with the Job Board website: owner, HR, recruiters and hiring managers. Candidates keep using your careers website. The app talks only to your website, so all data stays on your server.

One app for every companyThe platform address is set once when you build the app. People find their company with its code, a QR code or an invite link, then sign in with their normal account.
Same rules as the websitePermissions, hiring-manager limits and stage automations are the website's own, because every action runs through its API.
Works with a weak signalThe last answer of each list is kept, so screens still open without internet.
Push notificationsOne Firebase project for the whole platform, saved by the super admin. An in-app list works without it.
SecureLogin token in the phone's secure storage; https only; two-factor sign-in supported.
Ready for the App StoreStep-by-step build, signing and store submission in this guide.

What is in the package

AppFolderBundle idFor
Job Board Recruiterrecruiter_app/iphone_app/com.smartweb.jobboard.job_board_recruiterOwner, managers, HR, recruiters, hiring managers

Inside the folder:

Folder / fileWhat it is
lib/The app's source code (Flutter / Dart): api/, state/, util/, screens/, widgets/.
ios/The iPhone project, already set up (permissions, icons and notification settings).
assets/icon.png, the app icon.
test/, tool/Automated tests (they run against a pretend server, no internet needed) and the script that makes the store screenshots.
docs/openapi.yaml (the API the app uses) and screenshots/.

Features

For the hiring team

What each login can do

The app shows only what the signed-in person may use on the website. These are the usual roles; you can change them under Roles & Permissions.

LoginIn the app
OwnerEverything: dashboard, candidates (add, compare, bulk, move, rate, email), schedule interviews, offers, jobs and requisitions (approve), talent pool invitations, reports, AI score and assistant, onboarding, activity, and the notifications of the whole company.
Manager / HRThe same as the owner except what the role does not include: typically no approvals, activity log or settings. Candidates, interviews, offers, reports and the talent pool are available.
RecruiterJobs, candidates (search, add, move, comment, email), interviews and scorecards, talent pool. Reports and offers only if the role allows them.
InterviewerTheir own interviews (Mine), the video link, the candidate profile and the scorecard, plus a reminder list of scorecards still owed.
Hiring managerTheir own dashboard with their jobs and candidates, only for the jobs they are assigned to. They read profiles and timelines, join interviews, fill in scorecards, compare candidates and send feedback (shortlist / keep on hold / not a fit with a reason) that reaches the recruiters as a comment and a notification. They cannot edit, schedule, send offers or email candidates.

Common

Requirements

Your computer (to build the app)

Phones that can run the app

Accounts

Website

Install Xcode & Flutter

  1. Install Xcode from the Mac App Store, open it once, accept the licence, then run:
    sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
    sudo xcodebuild -runFirstLaunch
  2. Install Flutter: docs.flutter.dev/get-started/install/macos and CocoaPods.
  3. Check everything:
    flutter doctor -v
    The Xcode and CocoaPods lines should have a green tick.

Prepare the website

The app talks to your Job Board website through its API. Check these once:

  1. Job Board SaaS 1.9 or newer is installed (the API, the super admin's Mobile Apps page and the owners' Mobile App page come with it). After updating run php artisan migrate.
  2. https. Phones refuse plain http:// addresses. Install an SSL certificate and set APP_URL=https://your-domain.com in the website's .env.
  3. As super admin open Mobile Apps and save the Google Play and App Store links once your app is published, plus the shared push key. Each owner then opens Integrations → Mobile App to set the company's app name, logo, icon and colour. The address the app connects to is set in the app itself (see Set your platform address).
  4. Make sure the cron line of the website is set, so interview reminders (and their push messages) are sent.
  5. Create the users: Users in the admin panel. Give hiring managers the Hiring Manager role and tick them on their jobs.
The app shows only what the signed-in person may see on the website. A hiring manager sees only their assigned jobs and those jobs' candidates, interviews and scorecards.

Open the project

  1. Unzip the package and open the folder recruiter_app/iphone_app in Android Studio or VS Code, or in a terminal.
  2. Download the packages:
    cd recruiter_app/iphone_app
    flutter pub get
  3. Optional check:
    flutter analyze
    flutter test
    Both should finish without errors. The tests use a pretend server, so they need no internet and no website.

Run on an iPhone or simulator

  1. Open ios/Runner.xcworkspace in Xcode once. Under Runner → Signing & Capabilities choose your Team and set a unique Bundle Identifier.
  2. Simulator: open -a Simulator, then
    flutter run
  3. Real iPhone: connect it, trust the computer, switch on Developer Mode (Settings → Privacy & Security) and run flutter run.
The app opens on the sign-in page of the website you set in lib/config.dart. Use an https address the simulator can reach.

Set your platform address

One app is published for the whole platform and serves every company. The first time, a person enters their company code, scans the company's QR code or opens its invite link (jobboard://join/<code> or https://your-platform/join/<code>). The app then shows that company's logo, name and colour before sign-in, and sign-in is refused for accounts of other companies. The platform may also refuse the app: app disabled (the super admin switched the company off), plan ended, maintenance or update needed (below the lowest version set on Mobile Apps); the app shows the message. Make sure scanning works by keeping the camera permission that is already declared in the project.

Job Board is installed on your own server, so the app is built for it and does not ask people for an address or a company code. You set the address once, before you build:

  1. Open lib/config.dart and replace the address in defaultServer with your platform address (the same as APP_URL in the website's .env, https, no slash at the end):
    static const defaultServer = 'https://jobs.yourcompany.com';
  2. Or leave the file as it is and give the address when you run or build:
    flutter run --dart-define=SERVER_URL=https://jobs.yourcompany.com
    flutter build ipa --release --dart-define=SERVER_URL=https://jobs.yourcompany.com
  3. Run the app. It opens straight on the sign-in page with your company name. Sign in with your email and password (plus the 6-digit code if two-factor is on).
A build that still has the placeholder address shows This app is not set up yet with these same instructions.

Push notifications (Firebase + APNs)

Optional. Without it the app has its notification list, but no messages on the lock screen.

  1. Create a project at console.firebase.google.com and add an iOS app with your bundle id.
  2. Download GoogleService-Info.plist and add it to the Runner target in Xcode (drag it into Runner, tick Copy items).
  3. In Xcode Signing & Capabilities add Push Notifications and Background Modes → Remote notifications.
  4. In the Apple Developer account create an APNs Auth Key (Keys) and upload it in Firebase: Project settings → Cloud Messaging → Apple app configuration.
  5. In Firebase open Project settings → Service accounts → Generate new private key and, as super admin, paste the file on the Mobile Apps page under Push notifications (one Firebase project serves every company). An owner can press Send me a test message on Integrations → Mobile App to check.

When people are notified

Version numbers

In pubspec.yaml the line version: 1.0.0+1 has two parts: 1.0.0 is what people see, +1 is the build number. App Store Connect rejects a build number it has already seen. Raise both for every update you upload.

Your own bundle id

Set your own Bundle Identifier (for example com.yourcompany.hiring) in Xcode under Runner → General, and use the same id in Firebase and App Store Connect. The name under the icon is CFBundleDisplayName in ios/Runner/Info.plist (currently Job Board). To change the icon, replace assets/icon.png (1024 × 1024) and run dart run flutter_launcher_icons.

Create the app in App Store Connect

  1. In App Store Connect choose Apps → + → New App. Pick your Bundle ID (create it first under Certificates, Identifiers & Profiles if needed), a name and a language.
  2. Fill in App Information (category, privacy policy URL) and App Privacy (see Privacy & data safety).
  3. Prepare screenshots: use the pictures in docs/screenshots/ or capture your own on a simulator.

Build & upload

cd recruiter_app/iphone_app
flutter build ipa --release

The archive is created in build/ios/archive/. Upload it with the Transporter app (drag the .ipa from build/ios/ipa/) or from Xcode: Product → Archive → Distribute App. It appears in App Store Connect under TestFlight after a few minutes.

Publish on the App Store

  1. Test the build with TestFlight on a real iPhone.
  2. On the app's version page choose the build, add screenshots, description and a test account plus the address of a demo server for the reviewers (the app needs a Job Board to connect to).
  3. Press Submit for Review. Apple usually answers in one to two days.

Updates

Raise the version in pubspec.yaml, build and upload again, and attach the new build to a new version.

Privacy & data safety

The app has no analytics or advertising and talks only to your Job Board website (and to Firebase if you switch on push). Use this for the store forms:

DataCollected by the app?Notes
Name, email, phoneShown, not collectedAccount details of your staff and candidate details held on your website. They stay on your server.
Photos and filesNoThe app only opens resumes and documents that are already on your website.
LocationNo
Device identifiersPush token (optional)Sent to your website only if push is switched on, so it can send notifications. Removed on sign out.
Saved on the phoneYesLogin token (secure storage) and the last answers of lists (so they open offline). Both are deleted on sign out.

You are responsible for your own privacy policy (candidate data is personal data) and for stating where it is stored.

iPhone permissions used

PermissionWhy
NotificationsShow push messages (the person is asked once).
Background mode: remote notificationsReceive push messages.

Code structure

lib/
  main.dart                       start-up
  config.dart                     the address of your website (set before building)
  screens/                        every screen (app_root.dart switches between sign in and the app)
  api/                            API client (token, errors, remembered answers)
  state/                          sign-in, secure session storage, cache, push, app scope
  util/                           theme, date and text helpers
  widgets/common.dart             cards, pills, loader with pull-to-refresh, messages
test/                             unit and screen tests against a pretend server
tool/screenshots.sh               makes docs/screenshots/*.png from sample data
docs/openapi.yaml                 the API the app uses

The website address is in lib/config.dart. Colours and the theme are in lib/util/theme.dart (the teal is Brand.teal). The code in lib/ is the same in the Android and iPhone projects; change both, then run mobile_app/check-sync.sh.

Updating to a new version

  1. Keep a copy of your changes, your signing key and GoogleService-Info.plist.
  2. Unzip the new package, copy your changes over, run flutter pub get, flutter analyze and flutter test.
  3. Raise the version in pubspec.yaml and build again.

The app and the website are updated separately. Keep the platform at Job Board SaaS 1.9 or newer; the app uses its API.

Troubleshooting

ProblemTry this
“This app is not set up yet”The platform address was never set. See Set your platform address.
“Cannot reach the server” on the sign-in pageCheck the address in lib/config.dart and open it in the phone's browser. Check the SSL certificate (an expired or self-signed certificate is refused) and that the phone has internet.
Sign-in says the code is wrongCheck the phone's clock is set automatically (authenticator codes depend on the time).
A menu or tab is missingThe app follows the website's permissions. Check the user's role under Roles & Permissions.
A hiring manager sees no jobsTick the person under Hiring managers on the job in the admin panel.
No push messagesCheck that the super admin saved the Firebase key under Mobile Apps (push shows as On) and that the owner's Integrations → Mobile App page lists the phone and Send me a test message works. Check the APNs key is uploaded in Firebase and the Push Notifications capability is added in Xcode.
The list shows old data and a bannerThere is no connection. Pull down to refresh when it returns.
flutter doctor shows a problemFix the red line it shows, then run it again.

FAQ

Can one app serve several websites? No. The app is built for one website (yours). To serve another Job Board installation, build a second copy with that address.

Do candidates use this app? No. Candidates use your careers website. This app is for your hiring team.

Is the app free to use once built? Yes. There is no fee for the app itself; you pay the store developer fee and your own hosting.

Can I change the colours and name? Yes, see Your own bundle id and lib/util/theme.dart.

Is the AI assistant in the app? AI fit scores and summaries are shown when AI is connected on the website. The AI assistant chat itself is on the website for now.

Support & changelog

Open a ticket at support.smartwebinfotech.com. Please include your purchase code, the app version (pubspec.yaml) and website version, the output of flutter doctor -v, the exact error or a screenshot, and what you did just before.

Support covers installation questions, bugs and help with the steps in this guide. Customisations (new features, design changes) are not included.

Changelog

VersionDateChanges
1.0.0October 2026First release: Job Board Recruiter. Find your company with its company code, QR code or invite link, then sign in with your account (two-factor supported), dashboard, candidates with search, compare, bulk actions and add-by-hand, candidate profile with timeline and comments, schedule and reschedule interviews, scorecards, offers (write and send), AI score and assistant, talent-pool matches and invitations, hiring-manager feedback, jobs, requisitions, reports, onboarding, activity, notifications and push, saved lists.