The first step to getting from the idea to the final watch app wasn’t actually involving the Watch at all: Before I could get started, I needed to know how the existing smide clients actually work and how to talk to their server.
Then I wanted to have a unit-tested library that I could use from the Watch Frontend.
On top of that library, I wanted to have a command-line client for easier debugging of the library itself.
And only then would I start working on the frontend on the watch.
So as the Developer Beta 1 for XCode 11, WatchOS 6 and Catalina rolled out, the first few days of development I spent reverse-engineering the official Smide Client.
As always, the easiest solution was to just de-compile their Android Client and lo and behold, they are making use of retrofit to talk to their server which lead to a very nice and readable interface documentation right in my decompiler
Armed with this information, a bit of
grepping through the rest of the decompiled code and my trusty
curl client, I was able to document the subset of the API that I knew I was going to need for the minimal feature-set I wanted to implement.
In order to have a reference for the future, I have documented the API for myself in the OpenAPI format
This is useful documentation for myself and if I should ever decide to make the source code of this project available, then it’ll be useful for anybody else wanting to write a Smide client.
Moving to XCode: SmideKit
Now that I had the API documentation I needed, the next step was to start getting my
SmideKit library going.
Even though there are tools out there that generate REST clients automatically based on an OpenAPI spec, all the tools I looked at produce code that relies on third-party libraries, often Alamofire. As XCode 11 was in a very rough shape already on its own, I wanted to minimize the dependencies on third-party libraries, so in the end, I’ve opted to write my own thin wrapper on top of
SmideKit is a cross-platform (by Apple’s definition) library in that the code itself works across all of Apple’s OSes, but there are individual targets for the individual OSes
But by manually setting the
Bundle Name to
$(PRODUCT_NAME) in the individual
Info.plist files, I can make sure that all projects can just
import SmideKit without any suffixes.
As this library is the most crucial part of the overall project, I have written unit testes for all methods to make sure we correctly deal with expiring tokens, unresponsive servers and so on.
The command line client
The first user of
SmideKit would be a macOs command-line frontend called
smidecli. It would offer various subcommands for listing bikes, booking them and ending bookings.
Here’s a screenshot of me booking a bike
Going from nowhere to the working command-line client has taken me the whole period of Beta 1. Two weeks is a long time but between my actual day job and my newly put upon me parenting duties, my time was a bit limited.
Still. It felt good to go from nowhere to writing a library, writing a command-line frontend and then actually using it to book a bike. On the other hand: None of the code written at this point had anything to do with the announcements of WWDC. All work done could just as well have been done on the old SDKs. But still: Having a good foundation to stand on, I was sure was going to pay off.
Next time: Adventures in Beta 2