12 things I hate about iOS development

Originally posted as “10+ things I hate about iOS development” on Medium March 11.

As you might know, I finally released the first iOS versions of LIKE A HIPSTER and Hungry?. So I finally stumbled upon iOS development, although I tried to avoid for so long. And I’m not very happy with it.

I like to try out new technologies. I love to play around with stuff, especially mobile. So I submitted some more or less serious Android apps in the Google Play Store and developed also professional Android apps for Keyosk Tablets and Freewave. Since I already program with Java for 15 years now, it’s fun to develop Android apps because there are no obstacles concerning the language and it’s a very well thought-through framework.

But iOS is different. Why? Here are at least 10 reasons:

1. Swift is not intuitive

You can program iOS apps natively in Objective C or Swift. First I tried to learn Swift on my own because it’s the successor of Objective C (why learn an ancient language when starting iOS development from scratch?) but I soon realized that Swift and I were not made for each other. I never tried Objective C but Swift is super unintuitive and as some of you also might know I’m very impatient. But also pragmatic – so I checked some (Cordova) alternatives such as React Native and finally found Ionic. And this time it was love at first sight!

I’m a Java back-end (and Android) developer but usually I try to see the full picture of a software project so I would rather be called a “full-stack developer” nowadays. Usually I try to avoid front-end development because there are for sure better skilled people out there adjusting CSS and that other hardcore FE stuff, but with my current project George I slipped into AngularJS, which is very nice to work with, when you are used to the “law and order” of Java (I already had a talk or two about AngularJS at some conferences – here are my slides from Berlin).

Ionic is based on AngularJS so for me it was the perfect choice since I was already familiar with AngularJS. But developing for iOS means to use OS X.

2. Must use OS X

There is no way around it! You have to use OS X to build the iOS binaries and I never was a Mac user. Coming from the Java world which was from the very beginning conceptualized as platform independent it is strange to be bound to an OS.

So what I did was to virtualize OS X. Yeah, you might think now “WTF?”, but I really did! Some people warned me about it because it would be too slow or to complicated or so but I though I’ll give it a try anyway because “how hard can that be?” (famous last words!) and I really didn’t want to buy an overpriced MacBook.

So what I did was to get my hands on an OS X image and virtualize it with Oracle VirtualBox, which worked pretty well. The VM is fast, not slow at all! Also with the virtualization I didn’t have to switch computers all the time.

The only disadvantage of OS X as VM is that VirtualBox has a limitation of screen resolution on the virtual machine’s window in your original OS. So the VM’s window does not scale. But at least it is Unix… -ish.

3. Must use XCode

Another very limiting fact about developing iOS is that you can only upload the binaries in XCode! As far as I know there are alternative possibilities to the IDE such as JetBrains’ AppCode or alternatives to the build tools e.g. Fastlane or Ionic (also uses its own build tools) but you have to use XCode (at least from command-line) to submit the artifact to the iTunes app store.

I don’t like proprietary software. I’m an open source girl. And being limited and bound to something is kind of strange to me. So for actual development I use WebStorm that is per se a JavaScript IDE and then I commit the iOS stuff with Git to OS X and build and submit it there with XCode.

The one good thing about XCode is that the emulators start very fast. When starting an Android emulator you have to wait a minute or so for the Android OS to fully start up. At least one small advantage of iOS development.

4. Paid Apple developer account

If you want to contribute to the iTunes app store you have to buy a developer license. That’s very strange: So the community builds killer-features for the iPhone and they also have to pay for that?

It’s around €/$ 100 a year! At this point I don’t even see that the app will amortize this 100 euro/dollars in the foreseeable future.

In contrast to that gorgeous Android land it’s free to publish withing the developer program, you just have to pay a registration fee of $25.

5. Certificates, certificates, certificates

Generally speaking certificates and encryption are awesome! It’s the only way to secure communication or authenticate and authorize in a proper way.

For iOS development you need a bunch of certificates. Many certificates. Far too many! You need two for yourself (iOS Development and iOS Distribution). Then you need to register each of your development devices (e.g. your iPhone and iPad). Next you need to register your apps themselves (“App Identifier”) and last but not least you need a bunch of “iOS Provisioning Profiles”, again two per app – one for distribution and one for development – and also three (!) iOS Team Provisioning Profiles (at least they are managed by XCode itself).

In Android you just have two Java key-stores, one for development and one for releases. That’s it. Super secure and easy.

6. Keychain Access my ass

Unfortunately at one point the “Apple Worldwide Developer Relations Certification Authority” certificate expired (after only 2 years…) and it took me several hours to find out what was wrong because the error message just told me that my app developer certificates were not valid. Googling and trying to change my certificates also broke the currently published apps… Finally I got the right google-hit that this one certificate was expired. It was hidden in the Keychain Access tool by default, well because it was expired. But I already destroyed all my dear certificates, so I had to create all of them again.

Having all those certificates and your bought license you can finally start developing. In XCode of course.

7. XCode is too complicated

XCode is strange. Very strange. Especially when you are used to (Java) IDEs like IntelliJ, Eclipse or Android Studio.

For example if you want to release a build you have to add all these different versions of the app icons and launch images. Why aren’t they just generated automatically?

many many different icons

If you use Ionic it already generates a bunch of these icons and launch images in different resolutions but still you have to create a hand-full of them manually. And you have to associate these icons to the proper versions. It’s like playing Memory for developers!

And you’ll find the build artifacts under “Organizer”. Totally plausible, isn’t it? Why don’t you just call this menu item “Artifacts” or “Archive”?

Also you cannot archive an artifact if currently an emulator is selected as run-time device. Why not just automatically archive it for the default generic device?

Just to compare iOS and Android I’ll show you the number of clicks you need to release a version. In XCode you need to:

  • Click “Build”
  • Click “Archive” → the “Organizer” opens
  • select your version
  • click “Upload to App Store..” → a pop up opens
  • every single time you have to select our “Team”. Why not use defaults? This point will not change that often
  • send to Apple by clicking “Upload”

In Android Studio it’s:

  • Click “Generate signed APK” → a dialog opens
  • (enter keystore password if you like and) click “Next”
  • (choose build type and path if you like and) click “Finish”

This is only half the number of steps! And I also think the last step in Android Studio is not really necessary.

Apple always proudly presents its software and other products as super usable, but I really have to admit that, at least for the developer tools and developer experience, this does not seem to be the case.


8. Apple-XML

I call it “Apple-XML” because iOS uses XML in an unusual way, especially for the plist-file (Property List file), which is a config file for your iOS app. If you are lucky you don’t have to adapt it at all because the Cordova build tool already alters it for you but I ran into a Cordova plugin bug so I had to adjust this file myself.

Apple does not use the “proper” XML standard way such as:

<key name=”name”>value</key>

but in a way where key and value alternate in a list:

<plist version=”1.0″>

OK, this is very technical (and correct XML) and I also think it’s not a super bad thing but it just “itches” in by brain and I cannot scratch it.

9. iOS development limitations

There are unnecessary limitations developing iOS such as: You cannot use a transparent PNG as icons. Why not? A transparent icon would be so much nicer on the iPhone home screen!

It would also be very, very nice to use a GIF as launch image in iOS, but this is also not possible in Android.

10. Bad Usability of the iTunes Connect website

I just sum up some usability points:

  • The iTunes connect website does not work properly on Android’s internal chrome browser! The lower part of the website simply does not show up. That was pretty annoying since last weekend I was AFK and only had my Nexus with me and wanted to add Beta users to my iOS apps.
  • The website has a timeout of 30 minutes or so and it has disabled the possibility to save your password in your browser. Well Apple takes security serious, but in the wrong way! Every time I go to the iTunes website I have to enter my password which is very bad because of possible sniffing attacks, key-logger, or person simply standing behind you (“shoulder surfing”) if you have to enter your password all the time.
  • The website is also broken in that way that when you ran into a timeout you’re redirected to the the login form three times in a row because of improper session management. I hope, they’ll fix that soon!
  • Every time you submit a new release you have to pass several steps until you can finally submit a new version. You also have to answer the same questions all the time (does your app use encryption? does your app use ads?). But in a way that is consistent with XCode ;)
  • When you want to update your apps’ screenshots it also gets a little bit difficult: When you generate the screenshots on your emulators or devices you usually identify the device e.g. “iPhone 5”, “iPhone 6S” etc, but when you have to upload the iPhone 5 screenshot, iTunes Connect just shows you the screen-size e.g. “3,5 inch”, “4 inch”, “4,7 inch”, “5,5 inch”! Ok, maybe you might say now, that every iOS developer knows the resolutions of all iOS devices by heart, but I tell you, that’s again just one other point of your Tech-Stockholm Syndrome.

11. Crash TestFlight

I almost forgot to mention TestFlight, Apple’s beta testing tool! It is – you might guess it – complicated. A developer can add very good friends or other abusable people as Alpha or Beta testers and I’m very glad for every single one of them.

So you start adding their Apple ID email addresses and TestFlight sends them an email invite. To make things a little bit more juicy this email has to be opened on the test device itself, and since some people use a different email address as Apple ID than they regularly do, this is the first difficult obstacle for some. After opening the invite email on the device the poor testers have to install the TestFlight app on their device! So you need an app to test an app. At least the testers can submit feedback though this app – but actually no one did so far, they just texted me directly.

Another advantage of a distinct test management app would be to show you pending invitations for other app, but for some reason TestFlight doesn’t!

With Android you can decide whether you want to create an open or a closed Beta or Alpha (cannot choose that in iTunes), just add these people and they get the updates pushed via the Play Store. OK, they also receive an email and have to click on a confirmation link, but no special strings attached.

If you want to release a new Beta you have to wait for an Apple review, that might take some days (usually 5 days) and when the artifact is accepted by the Apple consortium is also is not directly published as Beta, but you again have to click yourself through the dialogs.

At least you don’t need a review with Alpha releases, but you cannot simply add Alpha users, you have to define a certain role for them in your company in iTunes Connect. So, who wants to be my new Alpha tester slash Chief Legal Officer?

12. No Hot-Fixes!

Last but not least: There is no extra workflow for hot-fixes!

This would be a killer argument against iOS development: If you find a bug or even if you find out you uploaded the wrong screenshot you have to wait for a new release to be approved.

If you are lucky you can request (with a simple contact form) a quicker release but this is not the standard way and Apple does not guarantee anything. So you release the bug-fix and hope for the best. And wait, 2–3 day or up to a week, to get your bug-fix deployed or app store entry changed.

In Android all releases are deployed in 2–3 hours. Just FYI ;)

Describing all of these problems I had with the setup and development of my iOS apps I’m even more proud that I was finally able to release the iOS versions of my apps LIKE A HIPSTER and Hungry?.


TL;DR  iOS sucks, long live queen Android!


Best of Source Code Comments

via http://kalekushal.blogspot.co.at/2012/01/funny-source-code-comments.html

* For the brave souls who get this far: You are the chosen ones,
* the valiant knights of programming who toil away, without rest,
* fixing our most awful code. To you, true saviors, kings of men,
* I say this: never gonna give you up, never gonna let you down,
* never gonna run around and desert you. Never gonna make you cry,
* never gonna say goodbye. Never gonna tell a lie and hurt you.

// Dear maintainer:
// Once you are done trying to 'optimize' this routine,
// and have realized what a terrible mistake that was,
// please increment the following counter as a warning
// to the next guy:
// total_hours_wasted_here = 16

// TODO: Fix this. Fix what?

// no comments for you
// it was hard to write
// so it should be hard to read
// I will give you two of my seventy-two virgins if you can fix this.

options.BatchSize = 300; //Madness? THIS IS SPARTA!

// I am not responsible of this code.
// They made me write it, against my will.

//Dear future me. Please forgive me.
//I can't even begin to express how sorry I am.

double penetration; // ouch

# To understand recursion, see the bottom of this file.
At the bottom file:
# To understand recursion, see the top of this file.

//I am not sure why this works but it fixes the problem.

//somedev1 - 6/7/02 Adding temporary tracking of Logic screen
//somedev2 - 5/22/07 Temporary my ass

* You may think you know what the following code does.
* But you dont. Trust me
* Fiddle with me, and youll spend many a sleppless
* night cursing the moment you thought you be clever
* enough to "optimize" the code below.
* Now close this file and go play with something else.

// drunk, fix later

// Magic. Do not touch.

Exception up = new Exception("Something is really wrong.");
throw up; //ha ha

//When I wrote this, only God and I understood that I was doing
//Now, God only knows

// if i ever see this again i'm going to start bringing guns to work

* OK; before you read the following code know what I am trying to do.
* I needed to get the list of child catagories from the root node so that
* the root node didn't appear in the selection box. But for some stupid
* fucking reason the stupid fucking DBA wont let me access the items using
* indices and I instead have to use their stupid fucking Iterator
* implementation. So there.
$firstList = $this->getRootNode()->getChildren();
foreach ($firstList as $node)
$nodes = $node->getChildren();
break; // wtf?

How developers feel

via http://www.lordofthejars.com/2013/02/the-reality-of-developers-life.html (see more at http://devopsreactions.tumblr.com/)


When you upload something to production environment:

When you find a problem solution without searching in Google:

When you close your IDE without saving the code:
When you try to fix a bug at 3AM:
When your regular expression returns what you expect it:
When my boss reported me that the module I have been working will never be used:
When I show to my boss that I have fixed a bug:
When I upload a code without tests and it works as expected:
When marketing folks show to developers what they have sold:
The first time you apply a CSS to a web page:
When the sysadmin gives you root access:
When you run your script the first time after several hours working on it:
When you go on weekend and everyone else are at office trying to fix all issues:
When your boss finds someone to fix a critical bug:
When you receive an extra paid if project ends before deadline:
When something that had worked on Friday and on Monday did not work:
When you develop without specifications:
When boss tells me that “tests are for those who doesn’t know how to code”:
When you update a database script and you note that you have deleted whole database:


Bier! – Babe’s Angle Beer Shots

Nun trinke ich also seit einem halben Jahr Bier und ich muss sagen, es schmeckt!

Als Jetset-Babe komme ich so ‘rum in der Welt und auf den Fotos der meisten Urlaube taucht nun stetig doch auch das eine oder andere Bier auf – danke angelol für den Hinweis -, sodass man schon von “Babe’s Angle Shots” spricht (vgl. Quentin Tarantino’s angle).

Hier ein Auszug von Flickr:















auf facebook:

Selbstverständlich auch auf twitpic:

Top 5 Geek Comics

Angelehnt an Cliffs Top 10 Geek Comics On The Web hier meine Empfehlungen:

1) Nicht lustig.de


(c) nichtlustig.de

2) Dilbert


(c) dilbert.com

3) PhD comics


(c) phdcomics.com

4) xkcd


(c) xkcd.com

5) Geek & Poke


(c) geekandpoke


und es gibt noch mehr!

Der Vollständigkeit halber – auch wenn es kein Comic ist – mein absoluter Favorit:

LOLCats auf icanhascheezburger.com

LOLCat-Stammbaum “I can has History“:

[zum Vergrößern klicken]


Ich habe nie Bier getrunken. Nie. Naja, vielleicht vor 12 Jahren einmal, aber damals nicht mal wirklich. Geschmeckt hat es mir jedenfalls nie.

In Thailand Dez/Jänner 2009/2010 hab ich nach einem meiner ersten Tauchgänge damals eines meiner zweiten ersten Biere getrunken, mehr aus dem Gruppen-Enthusiasmus heraus und nun habe ich einen Neujahresvorsatz: Mehr Bier trinken!

Mein Fazit: Die ersten paar Biere schmeckten furchtbar, vor allem die westlichen Biere im Vergleich zu Thailändischen/Asiatischen, aber man gewöhnt sich an alles.

Hier meine aktuelle Liste:

++ Corona!

+ Ottakringer, Stiegl, Budweiser, Schremser

– Velkopopovický Kozel (auch das Dunkle)

– – Wieselburger


ps. Anscheinend kann man mit der Nennung seiner Lieblingsbiermarke echte Flamewars und Glaubenskriege auslösen…

Girl Geek Dinner Vienna

girl geek dinner vienna ggdv

Einige Social Media-Queens in Österreich (darunter auch ich) haben sich zusammengetan und das Girl Geek Dinner in Wien (kurz GGDV) begründet. Der Anlass: Austauch von Frauen im Web-Umfeld zu allerlei Themen – und gutes Essen. Ein Wiki, die Facebook-Gruppe und die Xing-Gruppe dienen zum Vernetzen und sind offen für weitere Teilnehmerinnen:

Wer “Geek Girl Dinner” beitreten mag, ist weiblich, Geek, bloggt, bastelt an Computern rum, programmiert, designt und/oder lebt das Internet. Die Gruppe dient als Austausch und informiert über regelmäßige Treffen der Teilnehmerinnen.

Margit, Daniela und Meral sind die Initiatorinnen und standen Rede und Antwort bei einem Artikel für den Kurier (zum Vergrößern Klicken):


Das nächste Treffen, das Girl Geek Dinner IV, findet am 1. Juli statt. Anmeldung und Details beim Facebook-Event oder im Wiki.