We have just released the new bugfix version 3.0.3. Actually, it’s nothing spectacular: we find a bug or get one reported, we search and find a solution. Anger, developing ambition, childish joy. The normal emotional life of a software developer.
The world could actually be so beautifully simple: develop, create a new version, press a button and publish. In fact, this has worked pretty smoothly so far, especially with the web version. There are a few legal issues to consider, such as data protection and imprint, but otherwise publishing is a matter of a few minutes. Even the Android version is now relatively quickly done, even if Google is always coming up with some, sometimes very frustrating, harassment. But thanks to a significantly reduced build time of just 1-2 minutes compared to 15-20 minutes a year ago, a new test version or even the final version is created relatively quickly. And then it comes to the iOS version.
This article is intended to show a different side that we normally only discuss in our team internally. Not everything is always peace, joy and happiness. In my specific case, the story is about our iOS version, which is increasingly threatening to become a burden.
Unfortunately, it has become the norm for Apple to cause problems. It’s not so much about any new restrictions in the AppStore; as described, Google has them to the same frustrating extent. I’ll tell you about two specific examples that made the release of versions 3.0.x more difficult.
When we were ready to launch the new version 3.0 after almost a year of development, it was clear that we still had to check the iOS version. As we have said several times, we are only Android developers and it is therefore almost impossible for our team to work on the iOS version at the same time. This essentially fails due to the hardware required, a MacBook. Only I myself have a very old model that I once financed with your donations. And I booted it up. When I had created the new version, as I always did, the AppStore suddenly popped up with the following message:
The app must be built for at least iOS version 11.
This happens from time to time, even on Google’s side. So I changed something internally and tried again. And this triggered a chain reaction: the new standard could only be created with the new XCode version 14.1. XCode is the essential tool needed to create the apps and the only reason why all this has to be done on a Mac. However, it turned out that this XCode version could not be installed on my Mac. Because my MacOS was too old. Took a deep breath and moved on. So I tried to update the MacOS, which Apple friends say is always so easy and trouble-free. It wasn’t to be, because MacOS 13.6 stubbornly refused to be installed and always aborted the installation without any further error messages. After many hours, it turned out that my MacBook Air was too old!
You have to slowly think about it: Apple’s AppStore is forcing me to buy a new MacBook so that I can upload my free OpenSource software to them! This is incomprehensible from several points of view, because I refuse to discard a device that actually works and, on the other hand, because I am forced to buy expensive hardware. It’s not as if there are cheap variants in the Apple world, isn’t it?
I had already written to the team and announced that I was currently not willing to spend so much money and that the iPhones would probably no longer be supplied with updates. However, I had developed a little ambition and found a way to install the new MacOS somewhere in the corners of the internet. Now there is a USB stick permanently attached to my MacBook Air, from which the operating system is started.
I can’t say how long this temporary solution will last, but I can say that we don’t get enough donations in to be able to afford to replace a functioning device. So I don’t know what will happen after that. You also have to remember that Apple charges additional costs, unlike Google. We have to pay $100 a year to be allowed to publish anything at all in their AppStore – regardless of whether it’s freeware or not (which doesn’t stop them from taking the same percentage from the paid apps as Google does). And all this despite the fact that none of us have an iPhone and we couldn’t really care less.
Once everything was up and running again, I set about creating the new version. I’m familiar with the steps, I know where to do which selection – and I know that the entire process still takes about 15 minutes per version. Not including the waiting time for the initial checks in the AppStore. Strange errors occur again and again. These are actually the reason why we always hesitate so long to check the iPhone version: We want to be sure that functionally, on the side of our code, everything runs as we envision it before we worry about iOS-specific issues. And we want to avoid doing this more often than necessary because strange errors occur completely by chance. What worked yesterday doesn’t necessarily have to work today.
That’s exactly how it was yesterday afternoon when I decided to release what was actually a very small bugfix version. There were only very minor changes to the code, absolutely nothing that had any kind of different impact on the operating system than the version that was created before. Nothing at all. But bugs appeared:
Stored properties cannot be marked potentially unavailable with ‘@available’
I have absolutely no idea what that means. So I put it in the search engine. As it always turns out: The error has nothing to do with anything we can influence directly. It’s not a classic programming error, nothing where you say: Oh, we’ve forgotten a bracket, yes, that makes sense. No, this error seems to appear completely by chance for thousands of people all over the world and the relevant websites are full of oracle attempts to solve it. And because one of them is as incomprehensible as the other, I can’t do anything other than blindly try one after the other. At some point, one of them worked. I usually save such findings internally in a “cheat sheet”. Then it worked again – for a few minutes:
Command PhaseScriptExecution failed with a nonzero exit code
I can do about as much with this as with the previous statement. The difference to the previous error is that there are even MORE obscure solutions on the internet. And that means it took much longer to try them all. This ranges from the classic restart to complex interventions in some internal parts of the compiler or even the operating system. People on the internet seem to write completely randomly what they can think of and that this or that would have helped them, often with the clear statement that they don’t actually understand it either and are just parroting the solution that another guy posted on the other side of the internet. And almost everywhere there are up to hundreds of thumbs up and thumbs down. It’s not clear what helps why in the end. The only thing that is clear is that sometimes something helps and sometimes it doesn’t, and that you’re not alone, so it’s not a problem specific to your own project.
The problem here is actually that you don’t gain any kind of insight either from the error message itself or from the solution approaches. You don’t get the feeling that you are learning something. You don’t learn what specifically went wrong, what you need to do in future to avoid this. The changes seem completely arbitrary, I’m even afraid that the option that finally seems to work won’t break something internally so that something in the app no longer works the way it’s supposed to. Does the locating still work? Can we still save files? In the end, I can only try it out randomly and hope that firstly the AppStore won’t reject the app for ominous reasons, secondly that everything works properly and thirdly that the error won’t occur again in the future – or even lead to new errors of this kind.
Of course, strange errors occur from time to time, even in Android development. But it has never happened to me that I didn’t understand at some point what the problem was, what the error message was trying to tell me and why the solution worked the way it did in the end. I always tell my team members: When you fix a bug, I want you to understand and be able to explain to me why your fix works and why the code didn’t have the desired behavior without that fix. This is essential to avoid similar bugs in the future, it’s part of the learning process. I myself strictly adhere to this: I only commit fixes that I copy from the internet once I have really fully understood what they do. But that seems completely impossible to me with these iOS-specific problems. And that’s not because of my own limitations or my real fear of contact with the Apple world, but simply because of the mass of forum participants and the thousands of completely different solutions that actually only have one thing in common: They never have an explanation, they only ever mention the potential how, never the why. There seems to be no logic behind such error messages, not even the technology used for programming seems relevant in any way.
You also have to consider that every trial and error easily costs a quarter hour of your life, because that’s the time it takes to get a new version to the point where it crashes or not. It’s extremely frustrating on many different levels. And yes, there were more of these messages yesterday, including a rejection by the AppStore itself that was as implausible as the rest of the evening, because it worked when repeated identically.
The Leisure Time
I never tire of emphasizing that the GC Wizard is purely a hobby, a leisure project. And leisure projects should be fun and relaxing. At the moment, however, this part in particular is causing me nothing but frustration. It’s no fun to spend your time like this. You can’t even classify it as learning and training because, as I said, you don’t gain any knowledge.
I created the iOS version back then because I wanted to serve the entire Geocaching community. That’s why I chose the Flutter technology at the time, because it promised that you could serve several platforms without much extra effort. And that worked very well for a long time – and basically still does. But here we seem to be dealing with errors that are completely unaffected by this and may or may not occur, no matter what you do or how you do it. The fact is, the iPhone version is currently costing us a lot of time and even more nerves. For us, it’s an unpopular burden that’s getting bigger and heavier, and it’s all down to me. Nobody in my team wants to take over this task from me, which is understandable. None of us feel comfortable in the Apple world and cases like the ones described here don’t make anyone want to get involved. At some point, we have to ask ourselves clearly whether we are willing to continue spending our free time on such almost exclusively negative emotions and whether we want to continue running the iPhone version.
I think it would be better if we had a dedicated iPhone developer in the team, also because he or she would probably bring the appropriate working material with them. In fact, I personally have the theory that there are unlikely to be any open source developers in the community; all the projects I know of in this direction are Android projects. In contrast, all Geocaching projects for iOS, Cachly and Looking4Cache, are closed source and paid (or in the case of L4C, which is now free indeed, but only because it is no longer being developed). That seems to be Apple’s world: If it doesn’t make money, nobody does it. And conversely, I only know people who enter the Apple world because everything is so easy. Perhaps such (apparent!) perfection doesn’t create any incentive to build something on their own – someone will put something there for me. Funnily enough, however, it’s by no means the case that people are happy to pay for something if they don’t need to. The Gold version has only marginally more sales than Android: on both platforms, we are well below one percent of users.
I don’t want to send you home in such a strange mood, especially because you seem to have been reading along for so long. In general, I just want to say that I think the current version is really great. That my team and I have managed over the last four years to provide an incredibly powerful and highly professional software for all Geocachers free of charge and open source. A tool that should leave no wish open. I’m a really proud daddy who often just opens his baby and gently swipes through his many tools. It makes me happy every time that we have made it this far against all odds. Who would have thought that four years ago?