Creating my first own iOS app

Software developmentFlutter
  |  

Creating my first own iOS app

As teased in the last blog post I was testing quite a few music streaming services.

The problem

One problem I had, was to share songs that I liked with my kids. Yes, it happens from time to time that I like a song that my kids also like. More often than not, they don’t share my opinion on a particular song, but I keep trying 😅
The family completely refuses to switch to anything but Spotify, so I had to find a way to share songs with them that I found on other services.

The solution

There is that cool web service called Song.link that allows you to turn a music streaming service link into a link to a page that contains links to all the other services that have the same song.
Sadly they don’t have an app and only a guide for how to create a shortcut on iOS to use their APIs.
I found an open source Android app that provides a way to use the Song.link API to create these links. They did not offer a way to share the link to the overview page but was meant to directly turn the link of streaming service A into a link to streaming service B.
My first reaction was to fork this project and add the missing feature (including creating an upstream PR).

But I was not 100% happy with this app, so the expected thing happened that happens if you leave a software developer with a problem alone and give him a free version of GitHub Copilot: I started to write my own Flutter app.
This provided the perfect opportunity to create a quite small Flutter app from scratch putting GitHub Copilot to the test and to try out some new Flutter packages.

Putting Copilot to the test

I decided to use the Claude 3.5 model as this proved to yield some amazing results.
So after creating the app with flutter create I started to briefly explain my plan to Copilot and said that I now want to create the service that can talk to the Song.link API. I threw in the link to the API doc and Copilot generated a fully working song.link client in 10s. That’s amazing!
Then I started to generate more and more parts of the UI. Copilot generated everything into the main.dart file so at one point I decided to break the code up and that’s where Copilot started to struggle a bit. But with some correction and guidance we managed to split the code up into screens, widgets, data layer, services, and models.
At one point later in the process (the app was almost finished from a functional point of view) Copilot got completely stuck. I think I had a different opinion on how to implement a certain feature and just implemented it my way. From that moment on Copilot tried to use his intended approach on every generated code snippet. Even after explicitly telling it that it should use what’s already there it refused to do so.
I needed to start a new chat loosing out the context till that point to get Copilot resetted. It took a while after that until it grooved back into the process.
Then I needed to create a small landing page for the app store that hosts things like the privacy policy and help. Copilot generated a quite nice looking page. I was impressed when I added more and more functionality to the web page (like supporting English and German) with all the different clever ideas it came up with. I assume they just made that impression to me because I’m not a web developer and have no idea how to do this stuff, but I was definitely impressed.
As the page grew I needed to step in and guide Copilot a bit more into splitting it up and extracting common things into separate files.

App Store release process

Then came a really tedious process: The release process for the Apple App Store.
I only have read about the stories from other developers that struggle with the process and were complaining about how they were treated and how inconsistent the process is.
I can now confirm that all these stories are true. 😅
It started with a first rejection complaining that I used album art from a song in my screenshot. That was correct and fair. I changed the screenshot to use one of my Suno experiments that I released to Spotify. Problem solved…
Then the second rejection came in. This time arguing that the tester has no idea on how to test that. They wanted me to provide an example URI to a song. So I sent them the link to the song from the screenshot and restarted the process.
Then a tester found an issue on iPads. Which was also correct (iPads need a position parameter for the share sheet that I was not providing). So I fixed that issue and sent the app back into the approval process.
Then another tester rejected the app again with the hint that it is not working. After some reading between the lines I found out that the tester was missing the URL to actually test the app. So I sent the link again (that was also present in the conversation history but OK) and sent the app to retest.
Then I received another rejection. This time with a violation of this guideline:
App Store Guideline violation
I have no clue why this even is a problem but “promoting” all the streaming services the app supports was the whole purpose of the app!?
I answered with a statement that this is basically the whole purpose of the app and that I don’t understand how other song.link clients that were already in the App Store were able to pass this guideline.
Not sure if this helped or if I was just lucky to get a different tester, but the app was finally approved. 🎉

Every round of this ping-pong took around 6h which is quite annoying and is lengthening the process even more.

This is another confirmation for me to stay with Android.
If the approval outcome had been that my app is rejected then I had no alternative to get this app on my iPhone.
That’s too much control for my taste. I prefer loads of trash in the store and a sideloading option over a curated store that decides kind of “randomly” what is allowed and what not.

Result

The result is the app “Universal Song Link” that is now available on the Apple App Store and on Google Play.
It was quite an interesting experience, and it is really fascinating what LLMs can do already. This made it possible for me with a time investment of around 15h to create the complete app including the landing page (not counting the App Store ping-pong 😉).
At the same time it became clear to me that Copilot is not (yet) a replacement for a software developer. It is a tool that can help you to get things done faster and to get some inspiration. But it is not a tool that can replace the experience and the knowledge of a software developer.