5 Lessons I Learned Building a Full-Time App Business

Wow! My wife Khwan and I are already 8 months full-time into the app business. We went from 1 Android app to 12 apps, with 3 more soon to be released, plus the iOS version in beta.  Today I wanna share 5 lessons I learned in the journey.

This post is based on a talk we gave in Chiang Mai, Thailand. If you prefer to watch the video, scroll down!


1. Don’t build an app nobody wants

Before we started to create our first app a few years ago, I had big ideas about the app of my dreams. The more people it would reach the better. One idea was to build an app that would let you track the whole bus system in Southeast Asia.

Khwan, on the other hand, had the idea to build an app to learn Thai. My first thought was “What? Is that any innovative or new? There are more than enough apps in the Play store.”

In fact, there were probably 50 different apps to learn Thai already in the store. But Khwan had done quite some research and realized that all these apps were crap and we could beat them.

How did she do the research? She downloaded as many Thai learn apps she could and tested them thoroughly. Plus, one of the cool things about the app store is, you can read every single good and (even more importantly) bad review of your competitors.

Quickly, it became clear that our competitors had a lot of shortcomings:

  • Bad quality recording
  • No interaction, e.g. no quiz or mini games
  • Phrases obsolete or not practical
  • Interface ugly

And that was information right from our target customers!

Plus, we already could estimate how big the market was, by just looking at their download numbers on the Play store and using tools like AppAnnie and Sensortower for revenue estimations.

So in short, what we did was focusing on existing apps in the market that had an audience and made them considerably (!) better.

So should you give up on your innovative unique idea for the next million dollar app? Yes, at least when you don’t have other passive income sources yet. Even if your idea is great the risk is extremely high that there is no market (yet) for your app.

Go the safe route first (improving existing apps) and realize your dreams later when you have a stable income and much more experience in the app business.

2. Better launch too early than too late

When we finished with the first version of our learn Thai app, I hated it. Not only had it bugs and not a lot content at all. It also looked frankly, quite ugly. Plus, the app was totally free, without in app purchases or advertising.

This day, Khwan came to me and said: “So we are done, lets put it into the Play store”. I said, “NO way! Users will hate it so much, they will give us bad reviews, and then our rankings will drop and we will never be found again and our app will die.”

Luckily, Khwan convinced me and she was right again (as 99% of the time ūüėČ ).

So we launched the app and I was so ashamed for the app, I think I didn’t check the Play store stats for a week. But I was lucky – no one downloaded the app anyway. We had maybe 50 downlaods during the first week.

The very first version of “Simply Learn Thai”

So we decided we should do some Facebook marketing (see next point) and our downloads grew. And so two things happened:

  • Even though many users didn’t like the first version, they gave us valuable feedback on how to improve it rapidly. For example, we had forgotten a lot of essential phrases. Also, it turned out that a lot or our initial users were Germans, so we quickly localized the app into German.
  • Once we realized we had real people using our app (even if they couldn’t pay yet), we were extremely motivated to push forward and make the app better. Even though we both had a full time job at this time and could only work on the app at night and weekends, we worked harder then ever. A few months later, we released an update that enabled users to unlock paid premium content, and we had our first income. That was the time when we decided to go all in and quit our jobs.

What would have happened if we went on to make the app perfect and then prepare everything to make the ultimate launch event?

Chances are we would have spent months to add features users wouldn’t even like or use. Chances are we wouldn’t have released the app at all as our lives were busy at the time.

3.Do marketing, but don’t pay for it

When you release an app in the App Store or Play Store, assume that no one will find it in the fist place. So if you have no downloads, your app will stay forever at the bottom of the rankings and no one will find your app.

Luckily, there is an abundance of possibilities to get traction for your app. I would say it is reasonable to spend at least 30% of your time and resources into marketing (some say even 50%).

Now the easiest way to get the early downloads is to simply pay for traffic. For example, create Facebook or Google Ads and wait for the downloads to come in. The drawback of this approach is that has become extremely expensive to do so in 2016. You will pay at least 2-4$ for each download and this number is only likely to increase.

It is very unlikely that you will make the 2$ back for this single user. So you will lose a lot of money and are not even guaranteed that the downloads will push you up the rankings in the App stores. Paid downloads are also usually less valuable than organic downloads (organic = users who found you app by searching in the store).

So, what works if not paid marketing?

  • Marketing by Hustling: Get traction for free
  • App Store Optimization (ASO)

Marketing by hustling is posting your app in 100s of relevant Facebook groups, for example. It is posting content on Twitter and link to your landing page. It is launching each app on Producthunt and other product pages. I could go on and on with this. Every single tactic has proven more effective than paid downloads in our business. More free marketing tactics here.

Another great way to drive downloads is to translate your app into different languages. The downloads of our Thai app are only to 35% English, followed by Korean (16%) and Chinese (12%).

ASO is a great technique to drive free downloads. It involves making beautiful icons, screenshots, a good app title and description with your relevant keywords.

One example how we increased traffic is we tried out app icons in different colors, say one green, one red. Google has a cool feature (A/B testing) that allows you to show one icon 50% of your users, and the other one the other 50%. You can then measure the performance of each of the icons. We increased our downlaods by 10% just by changing the color of our app icon. Great bang for the buck!

4. Invest time in monetizing your apps

One of the most important things to consider is how you actually make money from your apps. There are a couple of ways, the most important being:

  • Sell the app itself (users have to pay for the downlaod)
  • In-App purchases
  • Subscription model
  • Ads

The first one, I would avoid at all costs. Due to intense competition of free-to-downlaod apps, users are just not used anymore to pay for apps.

As for the other three models, what to choose depends a lot of what kind of app you have. For simple games, ads may be a good choice. For more sophisticated games or casino games, think about a in app currency or payments to unlock new features.

For our language learn app, in-app-purchases were definitely the way to go, because naturally users are often willing to pay for content useful to them. Later, if you have a lot of satisfied users, you can think about introducing a subscription model.

When it comes to in-app-purchases, it makes sense to experiment a lot with the prices. E.g. we increased the price of our Learn Thai app by 30% and observed 6 weeks the user reactions. The result was clear: Profits in English speaking countries decreased sharply, whereas profits in German speaking countries and Korea went up.

So we reduced the price in English speaking countries and increased the price further in German speaking countries and Korea. After 6 weeks, we repeat the process until we find the sweet spot for the price for any particular app.

To summarize, think hard about how you will make money out of your app, but stay flexible and constantly experiment and optimize prices.

5. Build an app business instead of a single app

You should not go into the the app business with a single app in mind. Your first app will likely cost more time and money than any app you build later in the future. Your first app is first of all an opportunity to learn and make lots of mistake.

So if you decide to build an app, check whether you idea is scalable or not. Ask yourself, can I use the app code to build other apps that provides more value to the same customers, or the same value for another audience? A good example for this is our language apps. Once we had the Learn Thai app in place, we could easily exchange the content and make the exact same app to learn German, Chinese, etc.

Also, realize that you will not be able to do everything yourself once your business grows. And hiring staff will be a lot easier if you have documented all your processes so that they can take over easily.

I hope you learned something from our journey and would be happy to hear about your stories.

Here is the video of the event that accompanied this article:


10 Books I Read This Spring

My reading challenge continues! The last six weeks, I read 10 books and focused almost entirely on non-fiction books this time. Let’s dive into it!

1. Platform: Get Noticed in a Noisy World

51-rz4y3-xl-_sx333_bo1204203200_It’s a topic we as online entrepreneurs can hardly avoid: How do I make myself noticed in the digital world? Michael Hyatt, owner of a very popular blog, shares¬†his experience on how to go about creating your own platform (that means mostly blog in the scope of this book). He covers all aspects in great detail, from content creation to marketing on social media and many more channels. It’s a quick read and consists mostly of lists of bullet points. At times it felt more like blog posts put together rather than a well structured book. Still the content is worth the read.

My Rating: 3/5

2. Mobile App Marketing And Monetization

51jndeevvul-_sx331_bo1204203200_I didn’t expect much from this book, as often these kind of books are written by appreneurs who made very moderate success with apps and try to squeeze out more¬†profit from fluffy online books. But I was positively surprised. The author developed business apps with over 1 million downloads and shares some interesting insights on app store optimization. He thoroughly analyzed how the app stores work. One tactic is to include videos inside the app to increase retention rate. This supposedly ranks you higher in the app stores because they measure this figure. Lots of actionable tips in here.

My Rating: 4/5

3. Think and Grow Rich

51-nxokhkml-_sx373_bo1204203200_This is the mother of modern self help books. Motivational speaker and author Napoleon Hill wrote this near the end of the Great Depression in the 1930s. The main focus of this book is how to accumulate a financial fortune in a lifetime. Unlike many similar books, Hill does not spend many pages on the practical aspects of finances (such as compound interest and financial planning). Rather, he focuses on the mindset and thought model you need to become successful.

My Rating: 4/5

4. The Checklist Manifesto

41qn40zaexl-_sx331_bo1204203200_A fascinating book written by a surgeon who claims that checklists are essential in nearly every industry today. He uses examples from the engineering world on how they used checklists successfully to build airplanes and skyscrapers. He has very good arguments on why simple checklists should be used way more in clinics than they are today. A reason they are not accepted in the presence might be the pride of doctors: They have trouble relying on simple lists rather than on their years of expertise. Great book with many interesting stories and case studies.

My Rating: 4/5

5. The Alchemist

51yk2bz-ouml-_sx308_bo1204203200_I heard about this book quite a few times with praise. It is a fictional story about a young Spanish shepherd trying to find a treasure travels all the way to Egypt. It is supposed to be a parable on how to live a good¬†life and attain happiness. The book fell kind of short of my expectations. It might be the translation (it is translated from Portuguese) but the writing style didn’t excite me. It also was less deep and eye-opening than I had hoped.¬†Still I enjoyed the atmospheric setting and a few interesting views on the purpose of life.

My Rating: 3/5

6. Muhammad: A Biography of the Prophet

41mvvxjfnkl-_sx327_bo1204203200_A fascinating account of prophet Muhammed, founder of the Islam. Not only tells it a very interesting story about this leader who devoted his life to establish a monotheistic religion against all odds.¬†It made me also understand better the controversy around Muhammed’s actions. He was born in a long lasting period of war and extreme scarcity in Arabia. His early were threatened to be extinguished more than once. A book about war, courage, and faith. I also liked it because it relies on facts rather than on opinion. Highly recommended!

My Rating: 5/5

7. Meditations

51mpnninlzl-_sx331_bo1204203200_Written by the Roman emperor Marcus Aurelius, this is not merely a book but a collection of notes on how to live a good life. He¬†promotes a lifestyle according the¬†stoicism, a philosophy established by the early Greeks. He describes strategies on how to refrain from suffering, and to free oneself from affections and emotions. He emphasizes a lot of the shortness of life and that death is merely a brief change into non-being. I’m not rating this one¬†because it isn’t really a book. But it awoke my interest in stoicism and I will read more about it.

8. Rework

419f9j3gqxl-_sx339_bo1204203200_A brief book about how to build a good business. It is very different Рalmost all traditional management principles are dismissed. Instead the authors promote a faster approach to business, in line with the Lean Startup method. Indeed having read the Lean Startup (which I highly recommend), the book is less disruptive than the authors claim. Still, a lot of new ideas especially for startups and small business owners.

My Rating: 4/5

9. Zero To One

41purjbtwkl-_sx331_bo1204203200_A brilliant book by PayPal founder and Facebook investor Peter Thiel. It’s not only about how to build a truly innovative business. It also opposes traditional economic principles such as the advantage of perfect competition and instead promotes a monopolistic approach to business. If you are curious on how businesses as a whole will evolve in the future and what we can expect by technology, read this book!

My Rating: 5/5

10. Business Adventures

51p9yybetll-_sx322_bo1204203200_Wow, another great business book. Though already 60 years old, the 12 stories described are as relevant as ever. Drastic examples of failing currencies, fraud cases and stock market crashes illuminate how business works. Though dense with information the stories are highly engaging, it’s a real page-turner. Great stuff.

My Rating 5/5



All in all, I learned a whole lot with those ten books and I’m looking forward for the next ten. The last two books on this lists I can especially recommend. Hope you found something to catch your interest. Happy reading!

Lists That Appreneurs Will Love

Google is a great place to start your research about stuff you wanna learn. Google search has its flaws though. The search results might be biased by people who put¬†more money or know how into SEO. Google’s ranking also prefers older sites as they had time to build up more backlinks than newer sites. This is not helpful you research about fast changing technologies.


So often times, I will go through a list compiled by an expert first. Here are a few of those lists that proved to be helpful:

Mobile Apps

App Services: A huge list of all app service “you will ever need” ūüėČ

App Store Optimization: The best ASO tools compared.


Promotehour: 50 communities to submit your startup to in order to get more traffic.

50+ Websites: Another 50 places to submit your startup to. Also includes submission services.

Stock photos: List of 39 free stock photo sites.

iOS Development

Awesome Swift: Lots of frameworks, libraries, books and more all about Swift.

Awesome iOS: Huge list for iOS developers. Swift project are marked.

iOS Good Practices: Not really a list of resources. More a list of how to write better iOS apps. Highly recommended read!

Coding in General

Awesome Awesomeness: A list of lists! They probably cover every programming language you can think of, have fun.

Ultimate List of Programming Books: A lot of gems there. Mostly it’s more about principles of how to become a better programmer.


All the books I read this year 2014 and 2015 by the Simple Programmer. This guy reads a lot of books and shares them every year and comments them briefly. He mostly reads non-fiction and self help books.

Mind Expanding Books: Comprehensive list of mostly non-fiction books that may change your thinking in some way.

Tim Ferris’ Book List: Tim Ferris interviewed tons of entrepreneurs and remarkable people and asked them for their favorite books. This list is the result.

10 Epic Books: Rather short list, but I loved the books I read from there.


10 Must Visit Cafes For Digital Nomads In Chiang Mai

Khwan and I have been visiting tons of cafes during the last two months. Chiang Mai is full of great cafes. So we made it our quest to visit a new cafe every day.

Now, I’m actually not a big coffee drinker. So I¬†mostly order a greet tea or a fruit shake. I decide whether to like a cafe¬†not really based on how the coffee tastes. But on well you can sit and enjoy there the whole day!

So a good cafe needs to have

  • fast, reliable WiFi. You should not be forced to order for WiFi.
  • enough electrical outlets
  • comfortable seats to sit long hours
  • air condition, but not freezing cold one
  • long enough opening hours
  • not too expensive
  • music not too loud

Check out this list of cafes that meet this criteria!

1. QQCafe



Probably our favorite! Mainly visited by CMU students, the place is cozy and cheap. They also have Taiwan style bubble tea.

  • Opening hours: 8 am – 9 pm
  • Price for green tea: 45 THB
  • WiFi: Free and fast.¬†Plus, if you you know a student, you can connect to eduroam, the university WiFi – probably the fastest WiFi in town

2. Infigo Cafe


Located in the hard of the Nimman area, Infigo is a small friendly cafe. I like the dried bananas there. Comfortable seats, air con not too cold. Perfect!

  • Opening hours: 8 am – 10 pm
  • Price for green tea: ~65 THB

3. Into The Woods

Modern cafe with nice decoration. The tables are large. They even have a small collection of books in case you want to chill out.

  • Opening hours: 8 am – 10 pm
  • Price for green tea: ~65 THB

4. Elephant Cafe & Coworking


A mix between Cafe and Coworking space. Right now only the first floor is open, but it looks like they plan to transform two more floors into offices. As of now, the place is mainly visited by students and completely free. Drinks are cheap, too! For WiFi, I believe you must checkin in Facebook.

  • Opening hours: 7 am –¬†late
  • Price for green tea: 45 THB

5. 94 Coffee


Another one in Nimman. I like the big tables there. The place is very modern and they have delicious smoothies. The AC is sometimes very cold though.

  • Opening hours: 9 am –¬†7 pm
  • Price for green tea: 65¬†THB

6. Art Roastery


This place is a must visit. Very cozy and visited by lots of students, you can sit with your laptop and watch a beautiful garden scenery including small lake and fountain!

  • Opening hours: 9 am – 9 pm
  • Price for green tea: 65¬†THB

7. The Barn Eatery & Design


In case you haven’t noticed yet, we love student cafes! This is another very original one. Come early, it can get crowded.

  • Opening hours:¬†10 am – late
  • Price for green tea: 60 THB

8. Hana Zono


The area South of CMU is one of my favorites in Chiang Mai. This one is a cute cafe with friendly staff. Nearby the place are also a bunch of vegetarian restaurants worth a try.

  • Opening hours: 8 am –¬†10 pm (Sunday 10 am – 10 pm)
  • Price for green tea: 55 THB

9. Penguin Ghetto
















One of the reasons I love Chiang Mai is because of these odd places! Penguin Ghetto is a small cafe located in a small artistic Soi. It’s hard to describe, just check it out. Don’t miss the penguin cake ūüėÄ Also try out the delicious hand made pasta restaurant behind the place.

  • Opening hours: 9 am – 8 pm
  • Price for green tea: 50 THB

10. Brownie Brown Cafe Lab


Located in the quiet area near Jet Jod, this big cafe has a large cozy outside area. Inside there are also a couple of nice seats. They have a large variety of ice cream and brownies to choose from.

  • Opening hours: 10 am – 6 pm
  • Price for green tea: 55 THB

That’s it for now, though¬†this list is definitely incomplete. Hope it helps you exploring the amazing cafe scene in Chiang Mai!




My Favorite Android Libraries in 2016

When we started developing Simply Learn Thai more than 3 years ago, it was not much more than a bunch of code hacked together. Over the time, I learned that it makes a lot of sense to integrate third party libraries to avoid reinventing the wheel.

Here are my favorite Android and Java libraries that proved very helpful in the project.



Realm: Database framework. Android provides its own way of persisting data using plain SQL. This might be enough if you store very simple data. But as soon as your model got more complex, a ORM (object-relational mapping) comes in handy, especially if you update your app frequently. And Realm is really easy to use and provides excellent documentation. As a bonus, it is also available for iOS, so you can easily port your native apps to the iPhone.

Stetho: Debug bridge. Brilliant toolset developed by Facebook. You can view your persistent data in your running app via the Google Chrome inspector. It supports SQL and for Realm, there is even a plugin. You can also view your view hierarchy to quickly spot errors.

Espresso: UI Testing Framework. This library allows you to simulate clicks and other tabs in your app. You can then test if the expected behavior occurs. Recently, Google introduced its Cloud Test Lab¬†that you can combine with Espresso to run tests on multiple devices. I haven’t tried this¬†yet, though.

Screengrab: Automate Screenshots. You can also use this together with Espresso to automate making the screenshots for your Google Play listing. The library comes with a Ruby script that runs Android tests. In these tests, the screenshots are taken. Unfortunately, the script runs only on Mac on Linux yet.

Android In App Billing: Billing library. The Android Billing API is a really crude piece of software. Google released the API together with the famous Trivial Drive example. Developers could copy and paste the example in their code and adjust it. The problem is, it is quite buggy. There are lots of bugs in Stackoverflow about this. This library solves all the problems! It handles all the heavy lifting in the trivial drive example *bugfree* for you. I wish Google had done it themselves..


Because Android is based on Java, it makes sense to include Java libraries as well. Here are the ones I use.

Joda Time: Time and date operations.  This is just a must have when you are dealing with times and dates. It is 1000 times easier and intuitive than the verbose Calendar package in Java 7. Note that Joda Time got actually integrated into Java 8, but in Android, we are still stuck in Java 7.

Apache Commons Lang: Convenience methods. This library will make your life so much easier by doing some heavy lifting for you. E.g. string manipulations, numeric calculations and much more.

Guava: More convenience methods. Similarly to apache commons lang, this library developed by Google offers a wide variety of helper methods. It includes complex collections (such as Bimaps), string methods and much more.

Apache Commons IO: IO convenience methods. Java can be cruel when it comes to reading and writing stuff to the hard drive. Apache commons IO makes your life easier by providing advanced input and output streams, better encoding support etc.

Apache Commons CSV:¬†CSV parser.¬†We have a ton of data stored in CSV. This library provides a simple way to parse the stuff and use it further. Surely not the most powerful csv parser out there but for basic needs it’s perfect.

Mockito: Mocking framework. The most widely used mocking library for Java. Although you can run integration tests (AndroidTest) in Android, it really makes sense to write as many plain Unit tests as possible. Most Android components can be mocked away with Mockito.

PowerMock: Mocking framework. With Mockito, you can’t mock static and final classes. PowerMock let’s you do exactly that (doing some magic: reflection). Some purists say you shouldn’t use this library at all, because if you would write good code, you wouldn’t need it in the first place. I agree that you shouldn’t use it in your own code. However, what if a library provides a final class you want to mock? Also there are several static Android helper methods that you have to mock to test them. So I say use it, but with care.

Hamcrest: Matching framework. The best Java matching framework I know of. It enables you to write understandable tests. Also used by the Android Espresso library.

I hope you got something out of this list to make your Android coding more enjoyable. Do you know any cool Android library or framework? Let me know!

How To Create Multiple Versions Of Your iOS App In Xcode Part 2

In the first part of this tutorial, I explained how to create slightly different versions of the same app. Make sure you read this first.

What I left out is to how to deal with assets. In this post, I will explain how to create different launch icons and other resources (e.g. in app icons and audio) depending on which configuration you build.

Launch Icon

Let’s start with the launch¬†icon of the app.

Remember we created a custom build settings named LANGUAGE_CODE in the first part? We will use this flag now to make sure that we build our apps with the right assets.

For both app variants (Thai and Chinese), create  a new asset catalog: Press Command + N > Asset Catalog. Name the file img-th.xcassets for Thai and img-zh.xcassets for Chinese. Make sure that the checkbox to add the assets to your target is ticked for both files.

Screen Shot 2559-05-04 at 8.32.11 PM

Now create a new launch icon by selecting + >  New iOS Launch Icon. Name the icon for Thai AppIcon.th and the icon for Chinese AppIcon.zh.

Having done this, we need to tell the compiler to use the correct app icons. Go to the build settings as described in part 1. This time, search for “Asset Catalog” and select the build setting “Asset Catalog App Icon Set Name”. Put in the value¬†AppIcon.${LANGUAGE_CODE}

Now we can build the apps one after another and it will show the right icon for each app. The problem is, Xcode will now package both launch icons in the app bundles, even though we only need one. This might not be as bad in this example, but imagine you had 30 apps like this. 29 unnecessary icons in each app? Sounds like a bad idea!

Easy way: Exclude the unnecessary assets from the build

The solution is a build setting named EXCLUDED_SOURCE_FILE_NAMES. If you only had two apps, you would now go ahead and exclude the unwanted files from the build like so:

Go to the build settings and select + > Add User-Defined Setting. Name the new setting EXCLUDED_SOURCE_FILE_NAMES. The value for the setting should be img-zh.xcassets for Thai and th.xcassets for Chinese (Debug und Release get the same value)

But again imagine you had 30  apps. Then you would have exclude 29 asset catalogs for each of the 30 apps. Not funny!

Advanced way: Include the necessary assets

But there is a better (and a bit trickier) way. If you have only 2-4 apps, you can skip this step and go with the easy way.

First, delete the values you put in the EXCLUDED_SOURCE_FILE_NAMES setting in the last step. Now give all your app variants (Thai debug, Thai release, Chinese debug, Chinese release) the same value: img-*.xcassets. This works because EXCLUDED_SOURCE_FILE_NAMES understands the * as a wildcard. That means you excluded all assets from your build.

Screen Shot 2559-05-04 at 9.05.28 PM

Then, create another user-defined build setting named INCLUDED_SOURCE_FILE_NAMES. Give this the value img-${LANGUAGE_CODE}.xcassets.

Now it will exclude all your assets first and then include only the necessary assets in your build. This is because the variable INCLUDED_SOURCE_FILE_NAMES is applied after EXCLUDED_SOURCE_FILE_NAMES.

(Site note: You might ask, why all the trouble? Why not leaving the xcassets from the build target in the first place instead of adding it and excluding it later? This is because the compiler complains when you don’t include your launch icon in the target.)

In-app Icons

If you have any icons you want to be different in your app variants, this is very easy. Just create them in your assets along with your launch icon. During the build, the correct assets will be chosen.

Other resources

In our app, we have two other resources that needed to be loaded differently depending on the app variant: A database file (we use Realm) and a bunch of audio files.

These files you can simply not add to your target and add them via a script:

  1. Create a new group in your project and name it “data”¬†Create a sub group¬†for each of your variants. In our example, it would be data/th and data/zh. Put all your data in these sub groups.
  2. You have to create the folders physically in your folder, not only in Xcode. Since this might lead to trouble if you do this manually, I recommend the Command line tool Synx to rebuild your project structure in the finder. As in the doc described, use it like this: $ synx path/to/my/project.xcodeproj
  3. Now create a new build phase: Go to the settings of your project target (the place where you previously added the build settings) and select “Build Phases”. Select + > New Run Script Phrase and the following shell script in the new build phase:
cp -r "${PROJECT_DIR}/data/${LANGUAGE_CODE}" 

This will copy the resources in your data folder into your app bundle, but only the ones needed for each specific app variant of course.

Sigh! It’s done. I have to say as much as I like Swift, creating build variants is a huge pain in the ass with iOS. It is so much smoother with Android + Gradle.

If you feel I did things too complicated or you know any smart hacks, please let me know!


How To Create Multiple Versions Of Your iOS App In Xcode Part 1

You want to create multiple versions of the same iOS app with slight differences?

For our language learn apps, we had exactly this problem. We had one app to learn Thai, and we wanted another build of the same app to learn Chinese.

So these two apps should have the following differences:

  • Different app names
  • Different bundle ids
  • Different database loaded (Chinese words vs. Thai words)
  • Different¬†app icon
  • Different assets within the apps, such as icons and audio files

Let’s tackle these issues¬†step by step.

1. Create new configurations for each app

First you need two create a new configuration for the debug version of your app and one for the release version of your app.

In Xcode, open your project infos by clicking on your project root folder in the project navigator. On the left side, select your project. Make sure that “Info” is selected on the top. Under “Configurations”, press the “+” to duplicate your existing debug configuration. Then press the “+” again to duplicate your existing release configuration.


For our example, we will name the configs “Thai Debug”, “Thai Release”, “Chinese Debug” and¬†“Chinese Release”.

2. Adjust the configuration settings

Now we need to adjust the settings of each of these configurations to reflect the differences in both apps.

For the sake of simplicity, we change the settings directly in Xcode. (If you want to use .xcconfig files instead, I highly recommend going through this tutorial first.)

Change the Bundle Id: Make sure the root folder in the project navigator is selected. On the left side, select your project target. Select “Build Settings” on the top and make sure that “All” is selected (as opposed to “Basic”) .¬†Search for “Product Bundle”. In the “Product Bundle Identifier” section, give the different configs the following identifiers: “com.example.thai” for “Thai Release”, “com.example.thai.debug” for “Thai Debug”, “com.example.chinese” for “Chinese Release” and “com.example.chinese.debug” for “Chinese Debug”.

Change the App name:¬†Again, select the “Build Settings” on the top and search for “Product Name”. In the “Product Name” section, change the names to “Learn Thai”, “Learn Thai Debug”, “Learn Chinese” and “Learn Chinese Debug”.

Create user defined values: Because we want to load different data into each app, we need to define a custom variable that we will access in our Swift code later on.

In your “Build Settings”, click on “+” and then “Add user-defined setting”. We will name the new setting LANGUAGE_CODE and name it th for both Thai configs and zh for both Chinese configs.

Create Swift flags: But that’s not enough. In order for Swift to be able to read our variables, we need to define Swift flags. In your “Build Settings”, search for “Swift Flags”. Under “Other Swift Flags”, give all your configurations the following value:¬†-D ${LANGUAGE_CODE}

Now you should be able to use your flags th and zh for both languages in your code.

3. Read your settings in the Swift code

Create a new Swift class called BuildConfig that looks like this:

import Foundation

class BuildConfig {    

    static var currentCulture: Culture {

        get {

            #if zh

            return Culture.Chinese

            #elseif th

            return Culture.Thai





Culture is an enum containing the parameters of your build. From now on, you can easily check your build variant in your code. For example, you can check if BuildConfig.Culture == Chinese and load the according data from the database.

4. Done – Almost!

By now, your apps have different bundle names and app names. Also, you can use the BuildConfig class to implement differences between your apps directly in your Swift code.

Now it would be nice to load different assets such as launch icons, in app icons or audio files into each app.

This is a bit tricky, and I will cover this in part 2 of this tutorial.