Driver Wirelessgoogle play store • ios app store • gallery
In 2019, I quit a job I’d had for around five years, maintaining a large native iOS app. I was not feeling super-pumped about taking another iOS job at that point, because I was a bit distressed at Apple’s treatment of their developer community. So I started looking around for my next career specialization. I kicked the tires on a number of different technologies, then settled on Flutter, Google’s framework for writing cross-platform apps. There had been many times when I’d been an iOS developer when I thought “It sure would be handy if I also had an Android version of
this thing I’m working on,” so it seemed like a good choice.
To teach myself Flutter and Dart, I started building Swirl (see below). I figured I would work on it for awhile and apply to a few Flutter jobs here and there as I went along. I hoped I would be gainfully employed within a few months. Apparently I underestimated the demand for Flutter developers, because I wound up with a full-time job in a little over a week.
Driver Wireless is the app I was hired to create. It manages the workday for drivers who pick up loads of cars and trucks from one place and deliver them to one or more other places. CargoTel had an earlier app built with an HTML-based framework that performs the same function, but it was getting long in the tooth, and it only worked on Android devices. So I was tasked with writing a replacement, for both Android and iOS.
When a driver selects a load that has been assigned to her, the app tells her where she needs to go to pick it up, using her choice of apps for driving directions: Waze, Google Maps, and so on.
When the driver reaches the pickup location, the app manages the inspections that are required for each vehicle. This includes scanning VINs, noting any damage, taking pictures, and recording the vehicle’s color and other attributes. When all vehicles have been inspected, the app prompts for a signature from someone on site, verifying that the vehicles have been picked up.
The app then presents the driver with a list of stops that must be made to deliver all the vehicles to their final destinations. At the delivery locations, another set of vehicle inspections must be made, including a sign-off from someone onsite.
The first mobile app I ever created was Hearts Net (see below). It was written in Objective-C and C++, using Apple’s native UIKit frameworks. Swirl is a very similar card game, this time written in Dart, using Google’s Flutter framework, for tablets and phones running iOS and Android.
I stopped maintaining Hearts Net quite some time ago. At the point when it was abandoned, it ran fine on iOS versions 6 through 10. When Apple released iOS 11, it finally stopped working. That’s when I learned that I still have some very devoted users. Several people wrote to me to say that they were so addicted to my card game that they were postponing the upgrade to iOS 11, or else keeping an older device around specifically to run Hearts Net. That made me think about bringing it back in some form. When I decided I wanted to learn Flutter, a port of my faithful old card game seemed like a great first project. I started on this in 2019.
When I originally conceived of Hearts Net, I thought my “killer feature” would be realtime card games with up to four human players. Turns out I was wrong. Almost all my users played the game by themselves, against the robot opponents. So this time around I’m not going to bother with multi-player, and only support individual play.
Right about the time I started this project, I got a full-time job doing Flutter work, so I haven’t had much time to work on this, and it remains unfinished.
Service order management system for small gas and electric utility companies. Runs on iPhone and iPad. Written in Objective-C, using the ESRI ArcGIS mapping framework.
I was hired at GISbiz to create this app. I wrote it from scratch and maintained it for five years. During that time, it gained an almost unimaginable number of features: push notifications, asset inspections, programmable service order fields that can be customized for each client company, mapping tools, photo and audio attachments, helicopter-based pole inspections, form-filling and retrieval, real-time personnel tracking, offline “no-network” mode, custom searches, asset filtering, support for multiple map tile providers, and a lot more.
This app allows for filling out new forms and searching for and viewing existing forms.
Runs on iPad and iPhone.
Allows a great deal of customization with respect to field types, pages, and grouping. Allows several types of field validation, including ranges and regexes. Supports computed fields: the forms designer can take the values of fields A, B, C, add them together, and put the result into field D, similar to a spreadsheet.
Card game for iPhone and iPad. This was my first iOS project, which I used to teach myself how to write apps for the platform. Up to four players can play against each other in realtime via WiFi, Bluetooth, or Game Center, or you can play by yourself against robots.
Based on feedback from my users, I believe it had the best robot players of any card game in the iOS app store. It made up to 130 dollars a day in sales, and got as high as number 33 in the card game category in the U.S. store.
I got a big boost by making the game available for iPad on the very first day the hardware was released, in April 2010. Like everybody else outside Apple, I had never touched a real live iPad until that day. I developed it using just the simulator.
I had a Mac version mostly written, but I never got around to finishing it.
Slipknot was a framework for creating “Digital Catalog” apps on iPhone and iPad. I wrote the iOS wrapper, and the client supplied the HTML content for each app, which was updated dynamically every time the app was run.
There are a lot of popular HTML-based frameworks that do something like this today, but there wasn’t any such thing when I wrote this one.
I created a detailed preferences view so that beta testers can try out various parameter changes, such as enabling CoreLocation updates while running in the background.
The client wanted to make many apps of this type, all with different HTML content. To make that possible, I put 99 percent of the code for the app into a reusable static library. The code for each specific app is very small: a single source file and header.
DUB Contact Managergallery
Contact manager for iPhone. The app syncs your phone’s contacts to and from a backend web service, provided by the client I was working for. Users could also access their contacts from a web site.
There were also versions for Blackberry and Android, maintained by other developers.