Aleksandar • Vacić

iOS bits and pieces

Masterclass: iOS development in Objective C

That’s one pompous title, I admit. But I have no better idea how to call this series of posts I wanted to write for a long time. So let’s add a bit of context to it:

…for non-Computer Science developers.

I’ve been working on ObjC/iOS apps for a very long time, since day 1 of the iPhone SDK. Before that, I was (as it’s now called) front-end developer for 15 years, mostly working in HTML (since 2.0 times baby), witnessed the CSS birth and rise. Been part of the first batch of Javascript developers back in Netscape Navigator 2 then all the way through its rise into plethora of framework abominations “real” (sic!) developers made out of it when they were forced to use it. I did it because I was a designer at first, an UX designer at heart and web was new and exciting canvas for both.

You can see one thing missing from this retrospective. I was never a Computer Science student.

App Store pricing rules

Today’s post by Dan Counsell on his excellent blog touched on the subject I have analyzed long and hard, for months now: app pricing model. While his posts are usually very reasonable and grounded thinking I agree with, I found this one to be written from the position of a successful and well press-connected developer.
Most iOS developers will not be in that camp. They will be in my camp of devs making quality apps but being way out of limelight. Thus I think it may be worth it to you to hear a different opinion and try to find your way somewhere in between.

When launching new app, Dan recommends to go with the lowered introductory price. Say if you plan to charge 4.99, launch with 1.99. This will work only and really only if you have entire relevant press ready to write about your app. Blogs like MacStories, Mac Rumors, iMore, App Advice and/or heavyweights like Tech Crunch, Mashable, The Next Web or influencers like Daring Fireball. Or if you have an existing customer mailing list of 100k+ people.

If you don’t have such leverage, launching at discount is the worst thing you can do for your app business. The starting price is the precedent you make upon which all your future pricing will be judged. Do you see brand new movies or albums being launched at 50% off? Do you see TVs or cameras being launched with introductory discounts? No, because it makes no sense.

The launch price should be the highest ever price you intend to charge for the given major software version 1

Continuing from this, Dan recommends: “Putting your app on sale three or four times a year can give your bottom line a much needed boost.”

Err – no, will not. The same press-coverage factor comes to play here too. Unless you are already very big name and have a lot of press ready to write about your sale, the only thing that discount sales will get you is lowered income. Even worse – you may actually alienate your original customers who did not get the deal.

Don’t do sales unless accompanied by large marketing campaign.

Tweetbot or Clear going on sale will be a success because this will be mentioned everywhere, on blogs like Mac Rumors where even a sidebar mention is a huge deal. My Banca or Unitica going on sale will be mentioned by no one.

Lastly, pricing. That topic is very hand-wavy but there are few lessons I can share from multi-year and multi-app experience.

First, go see this talk by Michael Jurewitz and read his 5-part story on pricing as well.
Second…

Forget anything below $4.99.

Just don’t bother. Go with freemium app if the niche you’re entering is very crowded but your IAPs should also be $4.99 or above. Between Apple’s 30% charge and the taxes you need to pay, even a fiver is very low price.

If you do freemium, you actually need to charge more and need to be very, very clever how you position your pay steps. You need to offer enough for people to recognize the value but put the paywall at just the right place to make it worthwhile to pay up. Every app is a world for itself and there is no formula that will tell you what that place is. You need to find it for your app. And target for 10% conversion between people that will start your app at least 5 times and those that will pay. Price accordingly.

I’m at the end of the process of updating my apps and moving the prices up. I have low number of downloads, low number of actual customers. I make quality apps and target people valuing that quality. The volume and discount game is for rich and famous.


  1. A good call by Brian Oppenlander here. If you continue to improve your app, it’s quite OK to increase the price since the value has increased too

Store your Love

On the episode 112 of Release Notes podcast (certainly one of the most useful ones for this business) Charles Perry emphasized his view of the App Store as delivery truck for our apps. He wrote more elaborately on his company blog about that same topic.

The gist of the argument is that App Store is what it is and should not be confused with the actual business we do. I strongly disagree with this.

The iOS App Store is not just a delivery truck. For starters, it is the delivery truck, the only one out there. Here’s fun thought experiment: imagine there’s only one worldwide delivery service. No DHL, UPS, Fedex, USPS, Royal Mail etc – just one. Imagine how glorious would be to start a business like teespring on it and being faced with monopoly offers of “we can give you 5% discount if you ship over 1M a month”. Try to compete with the more established business then. Or imagine there’s only one payment processor.

The App Store is the only marketplace where you can compete as indie iOS developer. As such, the way it works and behaves strongly influences everyone’s business on it. You can’t just say – I don’t like this, I’ll pack up my stuff and go to some other place. There’s nowhere to go.

The App Store is also your storefront which, for some time now, strongly favors early comers and big-budget apps not interested in earning money. The App Store is also a dominant discovery truck where it fails spectacularly due to its abysmal catalog search.

When Brent Simmons published Love blog post, the there-can-be-success posts were almost exclusively from either the Mac or Mac/iOS devs. Apps like Capo or Coda or RapidWeaver are success due to their quality and upgrade revenue. iOS devs in the successful bracket are those who were doing business for a very long time and thus have the monopoly on the search rankings (say HoursTracker) and/or have amazing press goodwill and connections (say Tapbots or Flexibits).

The fact that there’s no viable way to re-monetize your existing customer base – no, subscriptions are not the solution for vast majority of non-game software – severely limits available business options. The usual retort of “well, you just failed to market properly” is wishful thinking, usually said by people who already have a successful app. In most cases, these developers achieved success pretty early in the App Store’s life. The reality of just how hard it is today hits them when they try to make the next app into a business.

I dare you to find me more than single-digit examples of iOS only apps who became solid, sustainable business in last year or two. @radiantav me, I will be glad to be proven wrong and possibly learn from those examples.

App Store is a market where app success as business is an exception, not a rule. More than anything else, that’s a sign of the business-unhealthy market. It’s a market to show off your skills and then earn your living somewhere else.

I find that really sad. That for me is the underlying sentiment of Brent’s post.

UICollectionViewCell woes with bounds change

Back in August last year I wrote about the issues I had with UICollectionViewCell and how it’s was impossible to have them behave properly when bounds of their container (UICollectionView) change.

These days I’m trying to get to the bottom of this and have to say – it still escapes me. I have actually found a combination of calls that somewhat resolve that issue, but it’s stupid-ass workaround. There has to be something I’m missing here.

Update (Jul 6th): fixed, see bottom of the post.

There’s a demo project on GitHub and here’s a video demo of the issue inside my app Unitica.