We are living in the era of mobile applications, usually called just “apps”. The mobile market is huge now, with astonishing number of devices both in type and amount, platforms, applications and app stores. Today, one company often needs more than one application: there are different apps for customers, for partners, for employees, for different roles. You need to provide those applications on more than one platform, at least on iOS and Android operating systems.
Agencies and software vendors have to develop and build applications for different operating systems. But that is not enough. The applications have to be managed and distributed somehow. You need a way to distribute new versions and sometimes you might need to control the devices as well. And last but not least, majority of the applications can’t function on their own – they rely on the servers for authentication, data, push notifications and other things. We need to ensure that the clients can easily talk to servers, using the same API versions, and that their communication is secure. This, of course, brings another level of complexity.
Both the development and the management of mobile applications can be challenging.This guide was written to provide you with a high-level overview of the current mobile development landscape. This article is by no means a comprehensive list of tools, approaches or available commercial services and solutions. It should serve as a starting point for people who are not familiar with the landscape yet.
Mobile Application Development
The biggest challenge in today’s world of mobile development is to create applications that work on most of the available devices, that means to develop applications for multiple platforms, but also for various device types like phones, tablets, watches or other wearables which all come in different screen sizes. Sometimes we have to consider that some devices don’t have certain features, e.g. they don’t have a camera or required sensors. And more often than not, we have to think about the availability and quality of the network and prepare our applications for offline use.
There are many things that need to be considered when developing a mobile application. In this article, I will focus on the various options to create, built and distribute applications. Best development practices about the network usage, user experience, design and other things are outside the scope of this guide.
When we talk about native applications, we mean the ones that are native to their host operating system. They use the SDKs (Software Development Kits) provided by their vendors to access all functions of the operating system and device they run on. They also typically use native UI elements to achieve uniform look and feel. Objective-C or Swift-based applications for iOS, Java applications for Android, or Windows Universal apps for Windows Phones are all examples of native applications. There are more mobile platforms of course, such as BlackBerry.
If the budget and time permits, separate native apps can be created for all different platforms (or for major ones). This however usually means that you need more developers with specific skills, and that can be quite expensive. Because of the price tag involved with native development, many companies settle only on producing two applications (for iOS and Android) which usually don’t support all older versions. And the rest? They go with Web, Hybrid or cross-platform applications.
If you don’t need to distribute applications through app store and don’t plan to use any device-specific features, it is possible to just create a web application. With so many Single-page application frameworks and new browser APIs to support offline use, it is an easy and affordable option.
For web applications you can use anything you know from the web, but you should optimize the app for mobile use. That means that the user interface should be touch-friendly and that the application will continue to work when disconnected from the internet.
jQuery Mobile has been a popular option to create touch-optimized mobile interfaces.
Applications use offline storage options in web browsers like Web Storage or Indexed Db to store data. Sometimes it is easier to use some better abstraction, so be sure to search for in-browser databases that built on those standards. One of the interesting databases you can use today is PouchDB to easily synchronize data with back-end.
Ionic will help you with the design of the applications and comes with an application framework included, in this case Angular. Similarly you can use Mobile Angular UI, Onsen UI or many others. And of course, with Cordova or PhoneGap you can use any web-based frameworks or libraries even when they are not specifically intended for mobile use.
The disadvantage of the hybrid applications is that it is challenging to create a good UI and also that the hybrid apps can be quite slow on mobile devices.
Cross-platform native app development
If you want to write your application logic only once, but you want to avoid the problems of web and hybrid apps, cross-platform native apps come to the rescue!
There are several solutions on the market today and sometimes it feels that new are coming every day. Appcelerator has been around for a while. Or have a look at cutting-edge tools like NativeScript or React Native. All of them not only provide a bridge to the native API, but also provide a way to define interfaces that will render using native components.
Cross-platform libraries, Push
There are certain features that are available only on one platform at a time. An example of such feature is Push notifications. Push providers are platform specific and therefore you can’t just use Google Cloud Messaging to send push messages to iOS devices and vice versa. That’s why push messages are often sent through back-end system that understands the differences and acts as a gateway. Unified Push Server from AeroGear project is an open-source Push solution that has a server program and a set of cross-platform libraries to make that easy. Commercial alternatives exist as well, ZeroPush and many other.
But there are other areas where having the same set of libraries/protocols can be useful. For instance, data synchronization or user authentication can be simplified across different operating systems if a cross-platform library is used. Usually this kind of libraries need to talk to a server and therefore you will see such libraries often as a part of commercial MBaaS (Mobile Backend as a Service) systems. One of the exception is AeroGear project which was created to offer exactly that kind of libraries in open-source way.
It is clear that mobile applications often rely on server applications. In many cases, server applications are custom-built web services providing a specific API (usually a REST API). With the explosion of Mobile solutions, we can also see a lot of commercial back-end systems that either provide a fixed set of features that you can use in mobile applications directly or that make creating a custom mobile back-end applications easier. We use the term MBaaS, Mobile Back-end as a Service, to describe such systems.
There are many systems. Red Hat Mobile Application Platform is an example of a system that offers both. You can easily create and run your own API-based cloud applications or use some available services like data synchronization and only write logic for your mobile client.
The services usually offered through such providers are data management and integration, identity management and authentication, analytics, workforce management, encryption and so on.
Application development without programming
Another hot thing in the space of mobile application development are all sorts of app designers and builders that allow people to create applications without writing a single line of code. Some of them are designed especially for people without programming knowledge, some can be used for rapid application development where designed application can be further extended.
A lot of you probably know Wufoo, a website for creating online forms. You can now find form builders included in some of the available mobile platforms as well. This is useful since many enterprise applications are designed to gather data in the field and form builders are great for designing such applications. And because we talk about mobile apps, some mobile-specific features like barcode scanning, location detection or signature capturing are available. Platforms that help creating such input heavy applications also usually have the capability to later view and browse the captured data. Red Hat Mobile Application Platform has such form builder.
There are also many applications that fall into a specific category, like an app for a conference or app for a restaurant. Some online app designers take advantage of that and offer users nice templates where you only need to fill in/upload some data, pick a logo and choose a theme. If there are not any other specific requirements, the created application can look quite good and obviously the development is much cheaper. Appy Pie, Bizness Apps, Como and Build Fire fall into this category.
The space of mobile app builders is quite populated, but the main target are usually agencies that have to produce many applications for their clients. It is then no surprised that the commercial app builders are typically based on subscription model with recurring payments. So it might be challenging to find something if you only want to pay once.
Since we need to develop and test applications for more platforms, we need an efficient way to build the applications as well as a way to distribute the builds to testers and other interested parties. The first problem is that applications for Windows Phone have to be built on Windows and the ones for iOS have to be built on Mac OS. Developers usually use just one system, so a separate build servers/machines are often needed for different platforms. This, together with the requirement to organize builds in a central location led to a creation of software that can run builds on different machines at the same time and that enable developers to build for any platform just by pushing code to a repository or by pressing a button. Together with the necessary hardware to run it we call it either build farm or compile farm.
Another use case for using build farms is a necessity to have some sort of certificate management. When applications are built for production to be distributed to customers or users, they should be signed with a certificate that can identify and verify the author. App stores like Google Play and Windows Phone Store require that you sign your applications. If more than one person is responsible for publishing the applications, it is very handy if the necessary certificates are stored in a central location and a release build can be made in the same place as a development one. Build farms for mobile applications usually have that capability and make the process of signing and releasing applications easy.
Since many developers and software companies can’t afford to have or don’t want to manage their own dedicated build farms, online build farms emerged so that people don’t have to manage their own hardware. An example of such compile farm is Adobe PhoneGap Build and Ionic Package for building hybrid applications or build farm in Red Hat Mobile Application Platform for native and hybrid apps for iOS, Android, and Windows Phone.
If you prefer to set up you own build machine, have a look at Taco tools from Microsoft that enhance the Cordova CLI (Command Line Interface) to run remote builds on iOS from Windows.
Testing mobile applications is a huge topic. One thing is to have a test framework that will let you control your application on a given platform, the other is to be able to mock the external environment. You might need to simulate different kind of networks or network unavailability, fake location for apps based on location data, mock sensors and so on. And after you have everything figured out you realize that you need to run those tests on wide variety of devices and OS versions. The proper resulting matrix of testing environment can be extreme. No surprise then that companies struggle to test their applications.
Sometimes it is feasible to use emulator and simulate different screen sizes and OS versions. But if you are serious about testing, a cloud of real connected devices is the way to go. There are some providers that will let you run your tests on hundreds of devices. Look at AWS Device Farm or Xamarin Test Cloud for inspiration.
Mobile Application Management
When applications are finished and ready to be installed on the target devices, another question pops up — how to distribute them? The most obvious way to do is to use the already available online application stores like Apple’s App Store, Google Play or Amazon Appstore. For customer-facing apps it is usually the best way since the app store itself can be a good marketing tool to get more users and customers. But those app stores will also take a quite a bit of revenue, about 30 %.
Many enterprise applications, however, can’t be public and the access to them have to be controlled. In that case you can introduce a private app store, a place for users to download your applications directly from you.
Dealing with the distribution of mobile applications is called Mobile App Management. App Delivery is actually just of a part of the solutions that are available today. MAM can also provide:
- authentication, ACL (Access Control Lists)
- configuration and version management
- performance monitoring
- reporting, usage analytics
- app wrapping
There are also solutions called Mobile Device Management (MDM) that focus more on the management of the devices themselves. They help to keep the devices secure, help with mass device configuration and so on.
When creating mobile applications, we have to make a choice between various technology to balance the required feature set, time, budget and knowledge required from the development team. We can develop fully native applications, mobile web applications, hybrid or cross-platform native applications, all with its own pros and cons. It is also possible to use various app builders and designers to build the whole app or its part.
Testing is a necessary part of the development process. It is much more complicated to do right than for other typical desktop or server applications, but there are now frameworks and device clouds available that make it easier.
Building applications (as producing binaries) can be also more complicated when more than one platform is involved. We can use remote build servers to cover other platforms and to store all builds centrally. They will also help with the certification management needed for publishing final versions in the app stores.
And last but not least, companies like large enterprises have to solve the problem of distributing and configuring applications and devices. We can use Mobile Application Management and Mobile Device Management solutions to manage both mobile applications and the devices they run on.