The lasts weeks I have been trying and playing with different frameworks, methodologies and alternatives to mobile cross-platform development. In today’s post I would like to share with you my conclusions and… headaches.
So, you know, by definition cross-platform development is never an easy issue. Every platform is very different from each other just because it needs to differentiate from the competitors. So you, as a cross-platform developer, have to deal with it. Period.
Differences between platforms
The platforms I’m going to consider along this article are: iOS, Android, and Windows Phone. From the point of view of the developer there are a bunch of important differences between these platforms:
- Programming language. Every platform uses a different main programming language: Objective-C for iOS, Java for Android and C# for Windows Phone.
- Hardware and Desktop OS requirements. For iOS development you need an Apple Mac computer with OSX. For Windows Phone development you need any computer with Windows OS. For Android development you are not restricted to any desktop OS or computer.
- Programming tools. Every platform has its own preferred programming tools (IDE). Xcode for iOS, Eclipse for Android and Visual Studio for Windows Phone. Obviously, if you want you can use any text editor in any platform but I would not try it…
- Devices capabilities and features. You know, this is one of the main headaches. There are a lot of devices with different capabilities and features (specially in the Android ecosystem). You will probably need to focus on a manageable amount of target devices.
- Mobile OS particularities (user experience). Another big headache. Every mobile OS is completely different from each other from the user experience perspective. That really increases cross-platform development difficulty.
- Screen sizes and resolutions. The most famous cross-platforms development headache…
So, as you can see, there are a lot of important factors to take into account if you are planning to go for cross-platform development. And this is only from the developer perspective. If you are indie, you will also need to take into account strategical and commercial factors. However, this (headache) is out of the scope of this article.
Problem statement
So, my problem statement is:
I need a framework/tool/methodology/strategy/something that allows me to create both mobile games and apps for iOS, Android and Windows Phone, saving a significant amount of time while providing the best user experience.
Easy, huh! 😉
My priority list
So, based on my problem statement, I wrote down a priority list for my requirements. From highest priority to lowest:
- User Experience. I have spent a lot of time creating iOS apps that offer to the user the best iOS user experience. Actually, this is currently my commercial strategy: I create high quality iOS apps and games spending a lot of time on UX design. This is something I don’t want to lose.
- I’m currently developing exclusively for iOS. The first platform I plan to jump into is Android. Later I will go for Windows Phone. So, by now, an iOS-Android solution is ok for me.
- Notice that in my problem statement I used the word “significant” when talking about time saving. I don’t really need to be able to reuse all the code or a high percentage of it. I only need the amount of saved time that makes cross-platform development worthwhile for an indie like me.
- Both games and apps. I need to be able to develop games and apps, with the same solution if possible.
- Cost don’t appear in my problem statement but, obviously, the solution I adopt must be affordable for me.
So, the solution I’m looking for needs to provide a perfect balance among the items in my priority list.
Alternatives analysis
According to my experience, the alternatives that are available currently can be divided into two main groups:
Currently, HTML5 solutions still have performance issues. So, although, performance is not explicitly in my priority list, it is part of the user experience. That’s why I avoided this large group of solutions.
Most OpenGL solutions do not present performance issues, at least for the kind of projects I usually work on. Generally, OpenGL based solutions are a good choice for game development: they allow me to provide a good user experience, they allow cross-platform development both for iOS and Android (and some of them also for Windows Phone) and they allow me to save a significant amount of time.
The problem is that it is very difficult to provide a good user experience when developing apps with OpenGL based solutions (the same problem is also present in the HTML5 based group). It is very time-consuming to reproduce all de nuances of each mobile OS user interface (animations, pixel-level details, shadows, reflections, …)
So, it looks like it is relatively easy to find a good cross-platform solution for game development in the OpenGL based group.
However, it seemed that if I wanted to offer the best user experience when working on apps I would have to develop them natively using the specific tools provided by Apple, Google and Microsoft.
The Mono family
However, a few weeks ago I discovered the CELL·SDK and the Mono family: MonoTouch, Mono for Android and Mono Game.
MonoTouch and Mono for Android are “commercial products built on top of Mono, which is an open-source version of the .NET Framework based on the published .NET ECMA standards”. For more details, refer to the official website.
The interesting thing for me is that MonoTouch and Mono for Android provide a C# abstraction layer to create native apps for iOS and Android. The frameworks provide bindings for almost all iOS and Android SDK functionalities. So the created apps looks exactly the same as the ones created with the official SDKs. Therefore, the user experience is the best possible.
On the other hand, “MonoGame is an Open Source, free OpenGL implementation of the XNA Framework for MonoTouch, Mono for Android, Mac OS X, Linux and Windows”.
So, the Mono family provides a powerful framework based on .NET technologies and C# that allows me to create apps for iOS, Android and Windows Phone. That doesn’t mean cross-platform directly, but combined with a good MVC (Model View Controller) design the amount of time saved may be significant, specially for the kind of projects that need a lot of Model logic.
That fits quite well my problem statement: using the Mono family I can create apps an games with the best user experience, I can create apps for iOS, Android and Windows Phone and, if I manage to come up with a software design that decouples the View code from the rest (using the MVC pattern), the amount of time saved may be significant.
CELL·SDK
EDIT: the CELL·SDK project has been cancelled (probably because of a lack of funds). The theoretical part of this article (the analysis) is still valid. However, now the whole .NET and C# thing isn’t so interesting for me now. I will write a follow up article discussing my new situation regarding cross-platform development.
However, MonoGame is still a low level framework for game development. Here comes CELL·SDK. CELL·SDK is a promising high level game development engine build upon the Mono family. So, you can benefit from all the advantages of the Mono family for app development plus the ability to rapidly create games using CELL·SDK.
The nice thing is that you develop both games and apps using the same development environment: C# and .NET.
Conclusion
So, my choice is Mono family + CELL·SDK. I have never worked with .NET technologies. That is a drawback. However, they look very powerful and quite easy to learn. Actually, I’m very exited with them 🙂
Yes, I know what you are thinking right now. This solution is not free?! No, it isn’t. Actually, it is probably one of the most expensive solutions. That’s why I wouldn’t recommend it to an indie that is starting his way on the mobile app development. However, I think that if you have some business build up around app development and you can invest some time building a workflow around this technologies that fits your needs, it is the best solution possible taking into account my problem statement requirements (specially the user experience one).
So, that’s the solution I’m trying right now 🙂 I’m developing a new app for a client using MonoTouch and Mono for Android.
I’m also working in a new game using CELL·SDK. By the way, I plan to submit it to the “CELL·APP Awards“. Wish me luck! 🙂
This post is part of iDevBlogADay, a group of indie iOS development blogs. You can keep up with iDevBlogADay through the web site, RSS feed, or Twitter.
Take a look at haxenme.org
Pingback: 15 марта 2012 «
You may also want to check out Gideros Studio, which is available at
http://giderosmobile.com/
Cheers
Hi, Toni.
IMHO the problem using multi-platform frameworks are basically two:
– integrate native code into your application;
– cost involved.
Let me say you want to release games that any of the following features:
– have in-app ads;
– use flurry to collect data usage;
– are integrate with openfeint.
It means that your game need to call Java functions in android, objective-c functions in iOs and C# code in Windows Phone.
Do the available frameworks allow developers to __easily__ call native code? No.
Some let you interact with native code but it’s a pain in the head and time consuming.
Moreover, you can’t rely that your code runs fine on every platform just because it’s working in one of them. The truth is that for each platform there is a different implementation that may contain bugs and sometimes some features are implemented in one platform and is not implemented in another one. In other words, in this regard it’s almost like to develop for each platform separately.
Many frameworks started with a reasonable price but suddenly they raised a lot. For instance, Marmaled (former Airplay SDK) had an indie license for just $99.00 / yr. Now it costs $499.00 / yr (I don’t consider the Basic license because it only allows you to develop for iOS and Android and shows a splash screen of Marmalade).
Imagine you have all your apps based on a framework that year after year has its price increased. It will turn your business into a unfeasible one.
That said, the best frameworks on my opinion are cocos2d-x and Marmaled respectively.
cocos2d-x has the advantage that it’s open source, its free, their developers are very helpful, they have much tolerance for basic questions for beginners (much more than I have ever saw on other forums) and that it’s basically cocos2d-iphone writing in C++ so the transition to anyone that knows how to develop for cocos2d-iphone an easy cake.
By the way, I started studying cocos2d-x some time ago and I’m very satisfied (even with the hassle of the JNI debugging on Android – but it’s an Android problem not a cocos2d-x problem).
Regards.
Hello Marcio,
Yes, I agree with you. Easy access to native code would be a killing feature. But, you know, the best would be an unified API that maps all the APIs from different platforms 😉
I will take a look at Marmalade 🙂
Thanks for your feedback!
Hi Toni,
I recomend you Marmalade in case you need a good product with support. But it’s not cheap.
I ported MarianoNinja to android wih cocos2d-x, and it’s to easy to begin working with cocos2d-x, expecially if you have worked on cocos2d-iphone.
By the way, you can use cocos2d-x on Marmalade, because it’s officially suported. 😉
The quetion is: it is possible to develop high quality apps (not games) with this kind of frameworks? I mean, with OpenGL or HTML5 based frameworks you can’t recreate easily the nuances of the different OS. How do you implement a native looking TableView in OpenGL or HTML5, for example? By hand? That is a pain…
Actually, the article is not about cross-platorm development for games. It is about cross-platform development for both games and apps. In fact, cross-platform development in games is not really an issue. It is a matter of flavors or preferences. Do you like C++? Go for cocos2d. Do you prefer Lua? You have Corona. Are you a web developer? Take a look at Impact. Do you develop great Flash games? You have nice extensions from Adobe. Do you develop 3D games? You have Unity3D.
The real problem for me is cross-platform development on apps. Do you know any framework designed for that?
The Mono family offers something like that. It is not a framework, though. It is some kind of abstractation layer that maps/binds every API of the iOS an Android SDK to C# and .NET techcnologies. Actually, you can use any API written in Objective-C. You only need to define the C# bindings. Actually, in the Monotouch documentation uses cocos2d-iphone as an example.
OpenGL frameworks like cocos2d work under the official SDK, at OpenGL level. The Mono family works above the official SDK. That’s a key design difference.
To sum up:
– Cross-platform game development = feasible issue
– Cross-platform app development = horrible headache
This sentence:
“The frameworks provide bindings for almost all iOS and Android SDK functionalities.”
needs to be built into a detailed review – “almost all” means “not for your use case” usually…
Maybe. But, you know, you will need to evaluate the solution for your particular use case.
There is no perfect and universal solution for anything because we live in real world and we must deal with limitations and restrictions.
The more options you analyse, the more informed conclusions you will be able to make.
I wrote “almost all” because, obviously, they always go after Apple. They need some time to update the framework after every Apple’s update.
Hi Tony, Moscrif should be added as an OpenGL alternative. It is free to download and uses all-popular JavaScript.
For easy cross-plattform devlopement, check out http://www.v-play.net
V-Play provides easy one-click-deployment. e.g. you develop your game on windows and can deploy it to iOS with one click.
Interesting article, but the added Edit leaves med very curious.
Why is the whole .NET and C# thing no longer interesting? When will the follow-up article be published? I am very curious to hear the rest….
The .NET and C# thing is no longer interesting for me because I needed I way to develop cross-platform apps and games with the same set of tools. When CELL·SDK was cancelled my needs were no longer satisfied with .NET technologies.
Anyway. I will publish a follow up article sooner or later but the short version is: I think that cross-platform mobile development is not worthwhile for an indie like me. The more platforms you support, the more headaches you have.
So what solution did you finally use for cross platform apps? I’ve been doing enterprise apps with Air, but performance was never so good.