Skip to main content

0017 - Use Swift to build watchOS app

ID:ADR-0017
Status:DONE
Published:2022-12-30

Context and Problem Statement​

We would like to ship a watchOS application bundled together with the regular iOS application. The watchOS application will act as a companion application and initially offer a way to view TOTP codes from the watch which were previously synchronized from the iPhone.

Considered Options​

Decision Outcome​

Chosen option: Swift using SwiftUI.

Positive Consequences​

  • Supports watchOS fully
  • We can build and debug the app properly
  • Fast development with declarative UI and Previews to enhance the dev experience
  • Code organized using components on the UI
  • Updates to the framework and the SDKs are available as soon as Apple ships them
  • A lot more documentation, examples and public repositories to check

Negative Consequences​

  • New tech stack to learn for the team
  • Even though we can debug the app properly we can't debug the iOS and the watchOS app at the same time (when debugging the watchOS app, a stub iOS app is installed on the iPhone so the original one is overridden by the stub one)
  • Set up is harder given that we need to bundle the XCode built watchOS app into the Xamarin iOS app and update CI accordingly

Pros and Cons of the Options​

.Net using Xamarin​

  • ✅ Keeps same tech stack
  • ✅ Shares a lot of code
  • ✅ Easier learning curve and reviews
  • ✅ Easy integration into the regular iOS app
  • ⛔ Several important issues affecting the watchOS dev experience, particularly can't debug correctly
  • ⛔ watchOS platform not being a priority for the .Net team
  • ⛔ No plans to include watchOS support on MAUI and neither on .Net 7 nor on .Net 8

Swift using WatchKit​

  • ✅ It's the native approach meaning it's always up to date
  • ✅ Lots of documentation and examples/projects to look
  • ✅ Debugging works as expected
  • ⛔ Steep learning curve (language + watch related stuff)
  • ⛔ Hard to integrate to the regular iOS app

Swift using SwiftUI​

  • ✅ It's the native approach meaning it's always up to date
  • ✅ Lots of documentation and examples/projects to look
  • ✅ Debugging works as expected
  • ✅ Fast development with SwiftUI Framework
  • ✅ Previews enhance the development experience to the sky taking a lot less effort
  • ⛔ Steep learning curve (language + watch related stuff + SwiftUI framework)
  • ⛔ Hard to integrate to the regular iOS app
  • ⛔ SwiftUI is not polished enough yet so some things to keep in mind are special navigation and rendering issues