My first iOS app just landed in App Store

First iOS app designed and coded by me just landed in the Apple’s App Store. Here’s how that happened.

First, you can check out my app here, it’s free to download: https://apps.apple.com/pl/app/znicz-basket/id1486580149

Note: unfortunately it’s currently only in Polish — I wasn’t able to add the English translation for release.

I wasn’t really going to make the app, as I was just focusing on the UX side of things. I carried out some studies, wrote a case and left that hanging. I did use some of the findings from my studies instead of creating the app, but that was it.

Image for post
Image for post

Then, I stumbled upon some news about Apple introducing SwiftUI, which is a completely new way ob building User Interfeces entirely in code. I tried making an app like this a 1.5 years ago using UIKit, but I failed miserably at the Interface Builder stuff. I just got so stuck and every change I wanted to make was taking a lot of time. I also had some other more important tasks to complete first in my life, so eventually I stopped working on the app.

Now, with SwiftUI — that’s a revolution. Writing apps in SwiftUI is much easier than it was before and to some degree very enjoyable! There are some issues with Xcode that are making the process a bit slower than it could be. Especially code error reporting needs fixing, and fast.

What I created is not exactly what I initially imagined in my case study. I had to limit myself as I understood I may not be able to create such a big app all by myself in one go. I had to remove a layer of gamification, for example. It’s going to find its way into the app sooner or later, though.

Image for post
Image for post

This is an app for fans of a Polish basketball team, Znicz Basket Pruszków. I’m a fan as well and as I was approaching my 35th birthday I wanted to celebrate that somehow. As I recently discovered SwiftUI, so I decided to create an app for the people who played a very important role in my life. It’s a birthday gift for them (guess I’m a Hobbit, if you catch my meaning).

Here are some of the thoughts I’d like to share with you about that entire process.

Image for post
Image for post
Home screen of the app

I created an initial project for the app 1.5 years ago. I did some studies and found out that we may be able to invite a bit more people to the games. Low attendance was the team’s biggest pain point.

  • I wanted to have an app that would act not only as pure reference, but also as a way to remember about games. Our goal is to attract undecided basketball fans to our games
  • From my studies I’ve learned that people percieve the distance they need to travel to attend our games is much higher than it is in reality (about 2x higher)
  • The main goal of the app is to show how easy it is to attend, and also to let users know about upcoming games so they can set time aside to watch them
  • We are all basketball fans and we strongly believe that the spirit of sports is still an important asset of human culture. We also believe that there are many people who enjoy sports in our local area that could benefit from coming to our games

I spent about 3 weeks writing the app and the backend. I did all the coding in Swift, a programming language from Apple.

Now, I wasn’t supposed to go back to development, just wanted to become an UX guy. But then SwiftUI got introduced and it was so fun to work with, I decided to give it a shot.

  • Written almost entirely using SwiftUI and wrapping UIKit controls in SwiftUI wrappers (MapKit mostly)
  • Extensive use of JSON to transmit app data from the backend
  • Geolocation services to provide directions
  • Images loaded from external URL (limits the size of the app on smartphone)
  • One external Swift Package used: SwiftSunburstDiagram for pie charts
  • Private repository on GitHub used as version control system and issue tracker
  • No tests written yet — will add them though
  • Most of the knowledge taken from RayWenderlich.com, Apple docs and by googling — usually from tutorials on https://www.hackingwithswift.com/;
  • one question asked on StackOverflow: How to show the entire List without scrolling in SwiftUI

The app uses a backing website to store and provide all the data and most of the assets (images etc.). The backend is built on WordPress and the app is using the built-in JSON REST API. This makes the data both easy to maintain, as well as simple to get.

  • Used a plugin called CustomPress from WPMU DEV (my current employer) to create custom post types and add meta fields to them
  • I’ve written some filters to add the metadata to the JSON output. The app grabs this JSON data periodically and updates all views
  • The backend website periodically refreshes the data from official sources, which include game statistics, external posts and YouTube video data. A cronjob is triggered every 5 minutes and the site usually checks for updated data every two hours, every hour on game days (Wednesdays and weekends)

Even though creating the app was very easy, I’ve stumbled upon some challenges on the way. Here are some of them:

  • I’ve never made an app before :)
  • Understanding my time limitations to ensure there is an app in the App Store for others to download instead of a project that’s in constant development for another year and nobody can use it yet. I had to remove some features from my case studies, at least for now
  • Bindings and Combine in general is a completely new thing in SwiftUI and I had to spend a bit of additional time to learn at least the basics
  • Lots of bugs in Xcode, especially in error reporting and live previews, made the process a bit difficult sometimes. Restarting my mac just to make something work isn’t my fav thing to do
  • Somehow I was exceeding YouTube’s API request limits when I tried to load the video data from the app itself and parse it there. I had to instead pull the data to the backend and serve it from there (as a form of caching)
  • The part of the app I had the most difficulty with was MapKit-related stuff. I postponed it a bit to the end of the development process, but eventually it turned out okay. It’s working, required a couple of bug fixes before release, and probably isn’t the best way to do it, but it’s good for now
  • Due to the app using SwiftUI, I had to limit availability to users with iOS 13 and newer
  • Many users complaining the app is only available on iPhone and requesting Android version. Some difficult discusions were involved.

There were some moments of discovery and happiness during the whole process:

  • Imagining the app was one of the best things I did in my life
  • SwiftUI is a great framework for creating apps!
  • Being able to use the app before release to check on some stats during a game
  • Team management being really positive about the app and helping me with everything I needed
  • Team sponsoring a recording session with a speaker for a trailer for the app in a proffessional recording studio, which I didn’t even imagine happening when I started working on the app
  • It was astonishingly fast. Entire app took just 3 weeks to complete, one week to test and fix bugs. And I think that’s good time, considering my complete lack of SwiftUI knowledge and the number of implemented features
  • App passed review on first try. I made sure to make whatever there currently is to be correct and good looking. I wasn’t able to avoid some UI design pitfalls, but I’ve learned a lot from that for the future

To sum it all up? I’m extremely happy I was able to do it!

Now I’m getting lots of requests from fans to create an Android version of the app. It was a big goal from the beginning to support both platforms and I’m starting to plan it now.

If you have any questions about any of the above, please feel free to ask!

Written by

Future dad, 9to5: tech support agent. I write about the User Experience of learning programming.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store