As explained before, I’ve decided to scratch my own itch and write an independent Apple Watch client for the smide.ch bike sharing service.
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.
Preliminaries
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 grep
ping 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 URLSession

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
One thought on “Fun with SwiftUI – Beta 1”
Comments are closed.