A Plain GMT Face

I’m a big fan of the GMT watch face added in watchOS 7. It perfectly balances beauty and utility. It lets me know at a glance what the time is on the east coast, without cluttering my wrist.

There is, however, something that really kinda annoyed me about the usual view of it. Usually it shows the abbreviation of the city you have selected for the bezel ring in the middle of the watch face. So in my case this typically said ‘NYC’. I can see why they do this, but it feels really unnecessary and ruins the aesthetic of the watch for me. I know it is New York because I set it to New York.

So I set out to see if I could fix this. The result (seen at the top of this article) looks so much better in my opinion. The process of achieving this, however, was a bit more involved than I would have guessed so I figured I share it here in case anyone else wanted to achieve the same look.

Step 1: Add the Location

The GMT face appears to show a predefined set of locations plus whatever you have added into Clock app on your iPhone. So the first thing you need to do is add the location you want to show there. To make it easier to find the right city later on you may want to add a second city in the same timezone as your target, even if it already exists.

Step 2: Change the City Abbreviation

Next you need to open the Apple Watch companion app on your iPhone. Scroll down to Clock, then scroll again until you see City Abbreviation. Then choose the city you want to change.

The resulting text field won’t accept an empty string, so instead you have to put in a space (“ “) character.

This setting doesn’t accept Emoji, but it does accept certain typographic characters. For example, you can set the “” as the abbreviation for a bit of a ‘monogram’ look.

Step 3: Choose the new city

Now tap on your GMT watch face’s center and you’ll be shown an array of options. Scroll with the Digital Crown until your desired location shows up. As it has no name this can be a bit tricky, and so I that’s why in Step 1 I recommended adding a second city so that you can find that one, and then choose the blank with the same time.

You’re all set.

David Smith




Pedometer++ Complications Overhaul

I just released Pedometer++ 4.7. This update dramatically expands the complications provided for your Apple Watch. You can now precisely choose how you’d like your daily step count to be displayed on your wrist.

You can choose between:

  • simple numerical counts of your steps, distance or floors,
  • goal progress rings,
  • detailed graphs,
  • or a simple icon.

All of these update throughout the day to let you know if you are on track with your goals.

Full Complication Options

Graphic Circular

Graphic Large

Graphic Bezel

Graphic Corner

Graphic Extra Large

Utility Corner

Utility Wide

Modular Large

Modular Small

David Smith




Following the Shortbread Crumbs

At the very end of yesterday’s Spring Loaded Apple event, there was a little easter egg.

Apple teases that they are about to reveal Ted Lasso’s secret shortbread recipe. Just as it is about to scroll into frame it cuts off.

This sounds like an internet treasure hunt to me, which I’m always here for.

Looking closely at the fractional letters visible I’m pretty confident that this first line reads:

1 1/2 cups / 340 grams cold unsalted butter cut into 1/2 inch pieces plus more for greasing pan

This is definitely a recipe for shortbread, I mean what else would need that much butter!

Searching for this exact string then leads you to this recipe by Melissa Clark for Bittersweet Brownie Shortbread.

The first line of this recipe matches exactly with what was shown. No other instances of that exact string seem to exist that I could find. So this has to be the recipe that they were referencing. Although, this is a two part recipe and only the first part seems to be what Ted would make.

So I then of course had to try my hand at baking it! I wouldn’t say that I am particularly proficient at baking…but as Ted would say…I gotta believe.

SO much butter.

Hey, that actually kinda looks edible.

Wait, 30 minutes while the house slowly fills with an astonishingly delightful aroma.

And…

WOW!

This actually worked, and tasted delicious. Even though my baking skills would certainly get me relegated from the ‘Premier League’ of Baking, I was able to pull this one off. 10/10, would recommend.

David Smith




Ian’s Awesome Counter

I just released Ian’s Awesome Counter, a utility designed to help you be more focused and aware of yourself.

It is an app with a bit of a backstory.

My son, Ian, can sometimes have difficulty with regulation and management of his attention. We’ve tried several different strategies for helping him with this. One of the strategies that we found most successful was giving him regular prompts throughout the day and asking whether he thought he was on task and staying focused. This increases personal awareness and gives us a scaffolding against which we can measure progress.

Initially this took the form of a repeating countdown timer and a hand clicker. This worked pretty well, but was rather cumbersome to maintain. Then something rather dramatic happened to push forward this strategy.

Back in 2019 my family and I visited Neuschwanstein Castle in Bavaria. While we were walking across the scenic bridge that overlooks the castle, the clicker we were using at the time slipped out of our hands and bounced unfortunately over the edge of the bridge and down the the steep ravine beneath us. Yikes!

This created a rather awkward situation for us as we were many weeks from the end of this trip and didn’t want to lose the momentum and sense of accomplishment Ian was feeling from using this strategy.

So Ian and I sat down and designed an Apple Watch version of the concept to make it easier to keep with us at all times…and to finish out the trip with. The app he and I wrote that afternoon was rough but it did the job and we’ve used it ever since. (He also drew the icon for the app!)

One of the key features in watchOS 7 is Family Setup, which allows parents to easily setup “child” Apple Watches. These are more locked down and limited in capability compared to a traditional watch setup, perfect for a child still learning how to manage their digital interactions.

I became very excited to update Ian’s Awesome Counter (as the app came to be known) for watchOS 7 so that I could get it loaded up onto an Apple Watch that he could wear himself.

Fall 2020 took a bit of an unexpected turn when Widgetsmith took off. Understandably this project got sidelined for a bit, but today I’m delighted to be able to share this app with other families.

This app is provided completely free of charge. I’ve found it really helpful for my family and my hope is that by sharing it, other families will reap similar benefits from it. While it was designed out of a desire to help a child with their attention management, it could just as easily be used to help an adult stay on task.

How to use

Configure how often you want to be prompted, when the prompts should begin and end each day, and define your daily goal. Then Ian’s Awesome Counter does the rest.

If you choose to turn on notifications you’ll get an alert at the end of every period asking how you did, and the values are recorded in the app. I’ve found this works really well. Getting regular reminders to evaluate if you are on task helps nudge you to be more focused.

You can see your last week’s performance in the History view. The app also includes a variety of complications to get easy access from your watch face.

It can be worn either by the person working on their focus or by a parent/carer who can then relay the prompts.

David Smith




Watchsmith 2.0, Dev notes

Having just pushed out Watchsmith 2.0, I wanted to take a moment to mention some of the interesting technical challenges I ran into while building this update.

1. Getting photos to the Wrist

I did a whole episode on Under the Radar about this, but the process of getting the photos for the photo complication turned out to be a giant headache. It has to rely to Watch Connectivity in order to work in all contexts which led to a number of challenges.

You’ve heard of Belt-and-Suspender development, well this turned out to be Belt-and-Suspender-and-DuctTape.

File Transfer methods turned out to be very unreliable, so I ended up needing to package them up as Data items and then send them in a dictionary.

I ended up finding the most reliable approach is to package them up and send them via UserInfo whenever they are first saved. Then if the Watch ever receives a complication configuration it doesn’t have the photo for it fires up the Messaging API and tries to wake the iPhone app and asks for the missing photo. Then failing that the main app UI will show the user instructions on how to ensure the messaging system gets connected. This works…but phew…it was rough.

2. Complication Descriptors

I really wish I could provide actual previews for my complications in the Watch’s complication chooser, but sadly this isn’t possible because whatever preview I provide isn’t ever refreshed, so if you change your configuration I can’t force the editor to reflect the change. I tried changing the configuration ID every time a change was sent, which worked but ultimately made ClockKit very, very, very upset.

Instead I worked out that the descriptors could be multi-line and so now show the Complication type along with its name in the description. This lets me sneak in more detail to the user.

3. Maps

The maps shown within Watchsmith are entirely custom. The built-in Apple Maps system that was added to SwiftUI just isn’t configurable enough. So I ended up building my own tiled maps system in SwiftUI with pan and zoom. This ended up being really helpful when it came to sharing the components between the iPhone and Watch. Since I’m not relying on the system components I got around all kinds of little availability gotchas between the two platforms. It is one of those rare cases where going it my own way, and not using a library or built-in approach, actually paid off.

4. Golden Hour Curve

This little bit of UI is my favorite part of the whole app. While it is a bit self-serving I nevertheless wanted to point it out. The smooth curve from the outside of the Apple Watch’s screen into the curve of the notch on the bottom of my UI just flows so nicely. Then, insetting the buttons within the curve of the screen just finished it off beautifully. The map in the background doesn’t serve too much of a utility but adding it in gave a lovely bit of context. 💙

I wanted to point it out because often I found myself annoyed that the bottom corners of my UI get clipped on the 40/44mm watches, but if you can learn to embrace them you can end up with some very cool UIs.

5. Accessible Button Style

For this update I wanted to give the configurator a bit more visual interest. Not quite going all the way back to the good-old-days of Skeuomorphism but heading definitively in that direction. This was where I ended up. I nice bit of depth but still clean. My early attempts at this ended up having nowhere near enough contrast but I really like the end result here.

Additionally, because this was all bundled up in a SwiftUI ButtonStyle it was really easy to make it respond cleanly to the Accessibility Button Shapes option. When that is turned on then the whole thing gets a much bolder border, that is still visually clean but much more present.

6. Saving SwiftUI Views to PNGs

Something I found myself using time and time again in this project was a little utility I wrote for exporting SwiftUI views to PNGs. In UIKit we have this behavior built-in but for SwiftUI sadly there isn’t any direct methods. The trick here was to instantiate a new UIWindow, throw my view into a UIHostingController and then use the UIKit render in context methods on the resulting UIView. This works and let me generate screenshots for marketing tools or for testing purposes. Sadly it doesn’t work on the Watch target, but since SwiftUI is pretty similar on both platforms I could usually just package up the code and get it working well enough on the iPhone to get a screenshot taken.

7. Random Border Trick

Something I often ran into with SwiftUI is a situation where something wasn’t working correctly with my refresh logic. Either it was happening way to often (sometimes even in an infinite loop!), or it would never happen on a view that I though should be refreshed.

A little trick I found super useful was to set the border of each of the various views involved to a random color [.border(Color(hue: Double.random(in: 0...1), saturation: 1.0, brightness: 1.0))] and then it see what borders change whenever the view rebuilds. This helped me countless times to determine where in the view tree the problem was.

8. UUID() considered harmful

It is easy to “fix” some SwiftUI data flow problems by adding .id(UUID()) to your child view. This forces the view to always redraw, regardless of whether the view system thinks it should be. I caught myself doing this many times, and then always regretted it. This is helpful as a quick patch during debugging, but never, never, never let that say in your code. It leads to all manner of weird issues later on.

Similarly, I was tempted a few times to just add a var id:UUID = UUID() to some of my model objects to make them conform to Identifiable. This was always a bad idea, and often lead to every SwiftUI developers worst nightmare…the dreaded AttributeGraph precondition failure: crash. The id you provide should be stable and consistent to the item being modeled.

9. San Francisco Rounded everywhere

The earlier versions of Watchsmith used the Decimal font in most of the UI. I love the font and still have it available in many places in the app, but ultimately found that it just didn’t work on the Apple Watch as a UI font. It is great for complications but in the end Apple knows what they are doing with SF Rounded and so I’ve moved over to that. It just ‘feels’ Apple Watch-ey in a way nothing else does.

David Smith