Android is not the same as an iPhone. The iPhone 4 is not the same as the iPhone 6, and neither is the same as the iPad. There have never been more platforms to run your app—and that's not even considering Windows phones, smartwatches and desktop computers (of Mac, Windows, and Linux varieties). It becomes even more complicated when you remember that not everyone upgrades a device's operating system as soon as the new version comes out.
Add in the fact that users today expect a seamless experience across all their devices, and building applications that feel and function the same way everywhere is a major challenge for software developers. Applications need to handle the different hardware platforms and different OS versions, accounting for the different features, screen sizes, and other factors that affect how users work with the application.
There are three different approaches you can use when developing for multiple platforms: create a mobile-responsive website, create a cross-platform application, or create a native application for each platform you'll support. Each direction has its own advantages and disadvantages with respect to how quickly you can get the application complete, how smooth and consistent it will feel across the platforms, and how easy it will be to support and maintain the application across all platforms in the future.
Creating a mobile website will let almost any user with a smartphone access your application, whatever device they are using. Developing for a browser is an easy way to build a prototype and use rapid prototyping to let users test out the application as it's created.
Browser apps are device neutral—mostly. You may need to apply different CSS styles to page elements depending on screen size. This can cause a proliferation of CSS rules, but the technical aspect isn't any more difficult than detecting whether a browser is Internet Explorer or Firefox for desktop development. And speaking of desktop, mobile websites work fine in desktop browsers too as long as they’re designed and developed with responsiveness in mind.
The downside of building a mobile website is that mobile browsers often can't use all the features and hardware of the phone—the ability to use hardware components like the camera and accelerometer really varies with the device and the specific version of the OS. Also, even though it's possible to include interactions like swipe and shake gestures in a website, users don't expect or know to use that. Mobile browsers also lack some of the functionality of desktop browsers, such as the ability to hover over an element. These limitations mean it can be challenging to build a usable app that provides all the necessary functionality.
A last issue with mobile web applications is that users don’t tend to bookmark or save them to the launch screen. Since they're not front-and-center like an app is, it's not as easy for users to get to them, and a user may be less likely to use the site than a different app that offers similar functionality.
The biggest challenge of creating a multi-platform application is how to manage the codebase. Typically, each platform requires unique code, meaning separate development and additional time for each platform. Lately, some tools have been created to let developers use a single codebase across multiple platforms. The tools let you create one version across multiple platforms and still have it look like a native application when it's deployed on each device.
There are limitations when taking this approach. Because it's not customized to each specific device, the application that's created still doesn't have full access to all the features of its runtime environment. You're also dependent on vendor code to integrate with the target platform, and will have to work around any bugs in their implementation.
Some cross-platform environments use standard tools like JavaScript, but depending on how the cross-platform support is implemented, working with a cross-platform tool may tie you to that vendor's products for all future development. This can become an issue if working with the vendor's APIs, and custom plug-ins requires special knowledge that's not widespread among developers—or if the vendor goes out of business or even just stops supporting the product.
A new product to support cross-platform development comes from Facebook. Their open source library, React Native, is meant to let developers work with JavaScript but still use iOS native interface components like UITabBar or UINavigationController. The library lets developers use their favorite web development tools and workflow but still end up with an app that presents the native interface when it runs on the target platform. Apps developed with React Native also take advantage of asynchronous communications between the app and the device, so operations can be completed without blocking the UI, leading to a smoother user experience. Right now, React Native only supports iOS, but if you can wait a few months, a version that will support Android is coming.
The most costly approach to creating applications for each platform is building a custom, native application for each platform you intend to support. Because the app is built directly for each platform, it leads to the most natural-feeling application and the best end-user experience. Native apps have full access to all the phone's hardware capabilities, including the camera, GPS, and accelerometer, so these apps can provide layers of functionality that apps developed in other ways can't.
It's expensive for development, because it requires a development team with expertise in each platform. That's an ongoing cost, because making modifications or enhancements to the app in the future means you need to keep that expertise around.
You may want to start by creating the app for a single platform, probably iOS, first to make sure the idea is worth it before investing the effort to build it for multiple platforms. It's also a challenge to be able to release new versions simultaneously across all your platforms; because you have multiple codebases, similar changes need to be made in many different places. Sometimes it's not as straightforward for one platform as for the rest, and you'll need to decide whether to go ahead and release the platforms that are ready or wait for all versions before releasing.
More and more, desktop applications are moving to the cloud and mobile versions in order to be universally accessible. Right now, mobile-specific applications tend to be locked into specific devices, with limitations in mobile browsers making it difficult to access the full power of the platform. If these limitations can be reduced in the future, mobile applications will truly realize the "write once, run anywhere" developer dream.