The iOS app for BOND, an e-bike ride sharing company that services public and private customers.

As you would expect from such a service, the app allows customers to fully experience the e-bikes provided by the company. During the past year, all backend services have been internalized by the company, so entirely new custom integrations have been built. The provided services are as follows (short summary):

  • Map discovery: geofences, bikes and other points of interest
  • Bike discovery: list and filter by relative distance, battery percentage
  • Bike operations: reservation (start/cancel), booking (start/end ride, report issue)
  • Restoring booking state after an app crash, uninstall or unexpected error
  • Trip history browsing, with the ability to download invoices
  • Driver's license verification process
  • Ability to manage payment methods
  • Ability to purchase subscriptions, and in-app credits for discounted use
Relevant Technologies
  • REST APIs: interaction with internal and third-party services
  • Alamofire: performing and managing networking operations
  • Google Maps: GeoJSON, points of interest, clustering, user's location, directions
  • Firebase: Crashlytics, Cloud Messaging, Dynamic Links, Analytics, App Distribution
  • Firebase: Firestore - business logic (chatrooms and messages, watchlists)
  • Jumio: driver's license verification
  • Stripe: adding/removing payment methods (including 3D-secure)
  • Fastlane: automated submission process
Implementation Details
  • Built entirely with Swift
  • Follows the MVC architecture
  • Storyboard-based UI

Registration Flow

Users are presented with a customized registration flow. It begins with a welcome page, which then leads the user to a registration process based on a phone number. Users receive an SMS code for confirmation, after which some personal data will be colected to finalize the creation process. Existing users will be signed in instead, after verifying their SMS code.

When opened for the first time, the app will prompt the user for location access (necessary) and permission to send notifications.


Discovery

Users have multiple ways to find bikes: move around the map to locate bikes nearby, or see a list of bikes, sortable by distance or battery level. When a bike is selected, the map will zoom or move to accomodate both the user and the selected bike.

The map will also show a geofence around the city's zone of operation, and display charging stations nearby.


Riding Experience

After booking a bike, users are presented with the Ride interface. From this interface they can manage their ride: toggle parking mode (lock the bike temporarily), end the booking or report an issue.It is also possible to collapse/expand the popover view of the ride interface.

During an ongoing ride, the app will follow the user's location on the map, updating its view accordingly. This is canceled if the user pans on the map, and is re-enabled after pressing the user location button.

After finishing a ride, a brief summary is presented, with a button to see more ride details, such as the ride costs.


Reservations

For convenience, users can reserve bikes for 10 minutes. If they do so, the "own" the bike for that duration, and a timer is presented to keep track of how much time there is left.

At any point, users can either cancel the reservation, or book the bike as usual.


Driver's License Verification

As a part of the registration process, before booking a bike for the first time users will be asked to provide their driver's licenses (legal requirements due to the bike's maximum speed).

Users are guided through the Jumio SDK (which has been customized) and submit their document. Upon completion, the app receives and displays a notification to the user, informing of the verification result: if successful, they can start riding, otherwise a new submission is required. The UI is updated accordingly to reflect the verification result.


Managing Payment Methods

Through this interface, users can add, edit and remove payment methods associated with their account. This associates a Stripe payment method to their account in the backend.

Users can also specify a default payment method, the one that will be used when attempting to charge a payment.

Side note: the swipe to edit/delete was built from scratch, it is not not a third-party library as none fit our UI designs.


Menu Options

In addition to the main experience, a side menu provides users with more pages and information.

Users can scroll through their ride history, find ways to contact support, access settings for the app and much more.