Native development, Titanium, Corona, Unity, Phonegap and more

[shadowed_600 img=”http://nocreativity.com/blog-engine/wp-content/uploads/2011/09/558011646_c208383352_z2.jpeg”]Xcode[/shadowed_600]
Ever since the iPhone has revolutionized the mobile phone and everything about it, there have been several tools out there to create apps for the iPhone, the iPad and all the Android driven devices. I have been toying around with some of them and reading up on others. I concluded that there’s a lot of tools out there and every single one of them is completely different. The thing that struck me the most though, is how many people don’t understand the differences. So here goes a blogpost about the different tools I’ve come across and what they actually do. I’ll run through them starting from the easiest ones to get started with to the more hardcore ones.

I’m very aware I might be forgetting some tools. However the ones listed here are the only ones I actually used at least once. Feel free to add other tools, the way they work and your findings about it in the comments.

Note: If anything, I consider myself an iPhone developer, not so much an Android developer, let alone a mobile developer. My findings and views on things are based on my preference towards iOS development. I’m not bashing the Android Platform. I just know more about the iOS platform. I just wanted to state that for the record before you read on.

Phonegap

[shadowed_600 img=”http://nocreativity.com/blog-engine/wp-content/uploads/2011/09/phonegap.jpg”]Phonegap[/shadowed_600]
I’ll kick off with Phonegap. Why do I think this is the most simple one? Well, it actually doens’t require the knowledge of anything new to create your first app. If you have ever built a mobile web app, you can create a Phonegap app.

Phonegap is essentially a web app -the same one you built the other day at work- embedded in a native wrapper. You build the app using HTML/CSS and Javascript. You can use plain old Javascript or make your life easier by using jQuery, Prototype, Sencha Touch, MooTools, etc to handle the interaction. Just like any other mobile website.

What the enduser sees is in effect a web app running inside a webview. So what’s the native wrapper for? Well it provides Javascript API’s to give access to the contacts, filesystem, camera, microphone, GPS, etc. Phonegap provides the bridge to the API’s normal web apps can’t get access to. It’s that simple.

Personally I don’t see the appeal; most definitely because the browser performance doesn’t come close to native app component performance. Think about scrolling through a list of 1000 entries.
I know a lot of people babble on about how you can ‘just turn your webapp into a native app‘. But what’s the point!? That native app doesn’t provide anything the web app doesn’t and it’s an app. You could as well make it a full fledged web app which users can just add to the homescreen.

Flash / Adobe AIR

[shadowed_600 img=”http://nocreativity.com/blog-engine/wp-content/uploads/2011/09/flashplatform.jpg”]Flash and Air[/shadowed_600]
Yea, you didn’t see that one coming, did ya? Yes, Flash can create iOS apps too. And of course you can create Android apps too (and you can even create Flash websites for Android!). Why does Flash come second in this list? Well anyone who can create a Flash app could create a iOS app using Flash. The eagle-eyed viewer has already noticed how I mentioned could in that last sentence. I have tried to create several apps (that actually do something) and every time I ended up realizing the same one thing: It performs like shit.

For those of you who don’t know: I spent the past 7 years being an active Actionscript developer. I’m not what one might call a Flash-hater. I’ve tried to create simple games and apps for iOS using Flash. A game using the accelerometer (which crashed when too much accelerometer data came in simultaneously. Limiting that datastream kind of went in the way of the actual game) and an app using the microphone (processing microphone input on an iPad 1 was so hard that any UI interaction would make the audio playback stumble). Both of them ended up staying ideas until I finally get my head around native iOS development.

Flash can compile native iOS apps. Those apps are not interpreted at runtime. Adobe says they’re actually generating the native binary that you would get if you built it using Xcode. Seeing how the performance of several natively-built games is perfect and Flash-generated apps (not even games) perform horribly, I’d say Adobe has quite some work before making Flash a viable tool for (at least) iOS development.

And I know what you’re thinking right now: “Dude, what about that Flash game that made #1 in the app store, not too long ago?“. Yea… Let’s talk about that… Why didn’t it run on my 1st generation iPad? Did the app need a camera? No. Then what else does the iPad 2 have, that iPad 1 doesn’t? Yes: CPU/GPU power. Let’s face it: It’s not an overwhelming 3D game. It’s a 2D game. It should run just fine on the 1st generation iPad. In comparison: The Back To The Future game (which is completely in real time 3D) runs just fine on my iPad 1. And so does the (rightfully named) Epic Citadel demo featuring the Unreal engine for iOS.

And if you have ever created a Flash app, you know how annoying debugging can get. Well debugging a Flash app on a device isn’t exactly what I’d call fun.

Titanium

[shadowed_600 img=”http://nocreativity.com/blog-engine/wp-content/uploads/2011/09/appcelerator.jpg”]Appcelerator Titanium[/shadowed_600]
This is actually my favorite. It gives best of both worlds. Titanium provides close to native performance (by using the native components) whilst having a simple and powerful API that gives access to just about any interface either iOS and Android has. I created a few apps using Titanium and all I can say is: It’s the fastest iOS app development tool I’ve seen yet. You can create great looking and feeling applications in very little time.

You create the app writing Javascript and calling Titanium’s APIs. “How is this different from Phonegap” you think? Well, the Javascript you write is interpreted at runtime (I’m guessing a WebView). However this webview is invisible and ONLY does business logic. In fact: It only does custom logic. For example: When you create a TableView, you call Titanium.UI.createTable() in Javascript. This calls a Titanium API that runs native code in the background and returns a native iOS/Android component with native performance. You populate the table component using more Javascript. Once the data is in there, the table behaves exactly as fast and smooth as any other tableview in iOS… Because it is a tableview in iOS. (Or in Android… You get the point)

The Javascript calls to the Titanium API are mapped to native code in the Titanium framework and generate native components. Events in those components are sent back to your code in Javascript where you can handle them. The end result is very fast performance. The slowest part of any Titanium app is app logic/handling events in Javascript (and let’s face it: That’s still faster than you can blink). The UI interactions, UI animations, UI effects and some platform specific calculations are completely native. Yes, native is key here. It means performance. Better performance means allows better user experience. (Some people still mess it up, even if performance is as good as it can be).

That native performance is wonderful. That’s why I love Titanium. The only bad thing I’ve come to notice. You can’t do any kind of image processing. So if you’re thinking about building the next Instagram, don’t use Titanium. Even though you have complete access to iOS’/Android’s camera API, you can’t heavily edit the image… And the same goes for editing audio/video. So in the end: Titanium can only create data-driven applications.

Oh btw: Titanium is free. It comes with a lot of luxury, some great tools, good debugging and access to everything native on iOS and Android! All that, for free. And open-source!

Corona

[shadowed_600 img=”http://nocreativity.com/blog-engine/wp-content/uploads/2011/09/corona.jpg”]Corona Game Development[/shadowed_600]
I first heard about Corona about a year ago. When I checked it out back then, I didn’t seem all that convincing and I didn’t spend much time exploring it. However when I was writing this blogpost I gave it another glance and I have to say: A lot has changed.

It looks like Corona has truly grown up and provides a massive API to create 2D games for iOS, Android and others. You write your code in Lua and when done you create a game that runs at native speed. Since I haven’t tested this myself, I wasn’t really convinced at first… until I saw the demos that were created in only a few hours and performed exactly like the blockbuster hits in the App Store. That’s immense!

Yea, remember those ideas for Flash games I had? I might just give Corona a run for it’s money. Again: Might just. If I spend 200$ for an application that should replace my free tools (Titanium & Xcode), I’d better really build a game with it.

Unity/Unity3D

[shadowed_600 img=”http://nocreativity.com/blog-engine/wp-content/uploads/2011/09/unity.jpg”]Unity[/shadowed_600]
This is by far the most exciting tool of all. One problem: Unity is designed to create 3D games. If you want to create a todo-app, this isn’t what you’re looking for.

The development environment is great, you can write the code in Javascript, CSharp and a handful other languages. The components can be put together using drag & drop. There’s an insanely extensive debugging environment. And when you feel the need to change some of the generated Objective-C code… You can. Unity generates an actual Xcode project before compiling the final app. You can access that project and change things according to your needs.

The 3D assets can be created with almost any 3D modeling application out there: 3D Studio Max, Cinema 4D, Blender and a few others. Unity even provides ways of nicely importing them. There’s also a 3D modeling feature in Unity itself, however I don’t know anything about it.
Soundscapes for the game can be created with any application you like and then imported into Unity. Again: there seems to be a sound editor/creator inside of Unity which they claim is pretty complete.

The one thing that I really love about Unity is the debugging features. It’s just brilliant. There’s several levels of testing your app.

In-IDE testing: Just hit the play button and you can run the game inside the development IDE using the keyboard and mouse.

Everything working fine? Okay, but now you’d like to test how the input with the iPhone or iPad work: Touch and accelerometer-based input. Well… There’s an app for that. The Unity Remote connects your iPhone/iPad over Wifi to your Unity IDE and sends the relevant input to the game running inside the IDE. At the same time you can see the game output (game UI) on your iPhone/iPad. The result is quick and easy testing of the game ‘on the device’ (since both input and output are both on the device) without installing it on the device.

Okay: Now we want to really test on device. You know, the way you’d do it in Xcode for example. That’s possible too: Just run the app on the device and have full on-device-debugging power. It’s just a few clicks away. The full debugging power comes straight out of Xcode. There isn’t any other tool that comes close to Xcode’s device-debugging. At the same time you can see all your logging inside the Unity IDE too. There’s actually multiple ways of debugging depending on your personal preferences. How’s that for 1 tool… Some creative suites don’t offer this kind of debugging choices.

When you’re ready to deploy your app, Unity creates the actual native app. Android, BlackBerry or iPhone (or desktop)(and soon Flash!!) are supported. And if you think the performance of this will be horrible since you’re creating a massive 3D game without writing native Objective-C: Nope. The performance is off the hook. It’s insanely good. Don’t want to believe me? That’s okay. How about Electronic Arts? Yea, if one of the world’s most famous game developers choses Unity, there is probably something to it.

Xcode / Native iOS Development

Xcode is the official toolset provided by Apple for any Mac and iOS development. And yes: This one is last in this list since, in my humble opinion, Objective-C is hard. I learned a way of implementing MVC at school but as it turns out, the one used in iOS development is very different. It requires quite some adaptation. There’s lots of strange syntax I’ve never seen. The development environment is pretty big and complex. Then there’s the .h and .m files (“What’s the difference…?“). There’s something called storyboarding that seems insanely weird at first, but actually makes total sense once you get what it’s for… Etc. Yes, Xcode is definitely the hardest tool of them all to get started.

However I don’t think Xcode needs a lot of explanation. It’s the tool provided by Apple. It’s what Apple considers the best tool they could get in the hands of their developers. And to be truly honest: It’s a pretty complete suite. It creates a native binary. There’s nothing more close to home than this.

Conclusion

Conclusion? There’s no conclusion! This was supposed to be a list of different tools to create apps for iOS (and Android and others) and explaining how they’re different from their colleagues/competitors.
But since you’re asking for one: I’d say depending on the kind of application you’re looking to build there’s a tool for you.

For 3D games: Use Unity. It’s powerful, it’s specifically designed to help you create games and you can create for multiple platforms.

For 2D games: I’d recommend Corona. It looks pretty promising. The API provides quite a lot of preinstalled game features (e.g. physics with Box2D). I’m pretty sure you can create a decent game with this, faster than you would in Xcode with Objective-C.

For purely data-drive apps: Use Titanium. You get the best of both worlds. Fast development & native look and feel.

For heavy calculating apps (e.g. Image/Video/Audio processing): Go native. It’s the only way. You could create a Titanium module which does the heavy lifting (using Objective-C)… But what’s the point. You could as well just create the entire app in Xcode then.

I don’t know when I’d ever use Phonegap to create an app…

Don’t use Flash.

I hope this was helpful for some of you. Let me know what you think in the comments.

20 Comments

Just want to get some more info here:
1) Did you use AIR 2.7?
2) Did you test it on anything other than an iPad 1?
3) Debugging an iOS app is indeed not possible (Apple restriction). But debugging an Android app is easy

We sure have come a long way. We now have over 25,000,000 Corona SDK based games/apps in the wild. And Flash still does not support Box2D out of the box. And we are faster and easier. AS3 is a nightmare. And yes, the co-founders of Ansca were the ones who built FlashLite, Flash Mobile Authoring and spearheaded Mobile Device Central for the CS line.

@Serge: Hi Serge!
1: Yes, I used 2.6 first. Then people on Twitter told me to check out 2.7 (which was released just a few days before I was toying around with this).
2: No, I didn’t test this on an iPad 2 or an Android device (since I have none of those).
3: Yea, I can image Apple’s restrictions suck a bit when trying to create debugging tools. Too bad!
4: I mailed you a zip with the source. Looking forward to your finds. Let me know what you come up with.
I think the iPad1 is relevant. I’d totally understand if it can’t keep up with 3D games, but I expected 2D games to run just fine on it. The iPad userbase is already very small compared to the iPhone userbase. _if_ I’d ever create a game (and that’s a big if) I’d probably want to target most of the possible audience. In this case: All iPad users (iPad1 and iPad2)
Thanks for your feedback and efforts! Really appreciate it!

@Carlos: Thanks for stopping by!
I wouldn’t go as far as calling AS3 a nightmare It’s a pretty nice scripting language that allows to do some cool stuff.
I love the demo’s you guys put up on the site! At first glance I thought they were the real deal! That’s a pretty impressive feat! Good job! Keep it up

I also made the jump from Flash/AIR to CoronaSDK, and it immediately resolved the performance issues we had. Although I miss AS3, you can hack together some fairly object oriented inheritance/composition architecture with lua tables. I love the idea of Unity3D but do not like the drag & drop model, I much prefer a more traditional code-driven approach. Great write up!

Great detailed post! Thanks for sharing the detailed results of your research, its very valuable. I haven’t done much with downloadable/native mobile apps yet. However I don’t really focus on mobile stuff (and miss the fun and probably the money I could make), I think in longer terms web applications have more future. Can’t wait till online web-apps would have possibilities (access webcam(s), touch events, accelerometer etc..) to create richer experiences. This would solve problems of porting, using odd programs and tools to ‘make it mobile’ I guess.

I was wondering if it is possible to use an html/JS only AIR-application (Dreamweaver can make AIR apps) to compile as mobile app for iPhone/Android, and how the performance would be. Did you try that too?

@Lee Owen:
I’m pretty sure you can go all OOP (without the drag and drop) in Unity. I’m not 100% sure. I know the drag/dropping is part of the ‘getting started’ series I followed. To be honest, I’d expect it to be able to create components programmatically. Do check it out, they offer free trials

@Mark:
Just to be clear: I’m not making ANY money with mobile apps. I just like to play with them and explore the possibilities.
I don’t think you can create native iOS apps using AIR for iOS using HTML/JS. I do know however that Dreamweaver CS5.5 comes equipped with Phonegap integration. So you can use their API to create native iOS/Anroid apps using HTML/JS with Dreamweaver CS5.5. I’ve seen a demo of this feature when I was in San Francisco at the Adobe HQ. It looked like a pretty nice workflow. However I wouldn’t use Phonegap as I don’t really know why I would create a mobile web app that and then wrap it in a native app.

Why don’t you advise phonegap ? Phonegap has the best platform support range that including wp7. I will focus mobile developing and researching development platform , so your article is helpfull thanks !!

I’ve had similar experiences to the user whenI tried AIR 2.6. Now with AIR 3.3, I can tell you the performance is much, much better.

Here is what I came up with after trying Titanium & AIR & Corona.

– For Games (2D), Corona is hands down the best and fastest SDK to learn and use, AIR would be a nuisance to use in terms of performance, unless you go with Stage3D, though you don’t have Adobe UI components you can use. MXML made it all cleaner to read and edit, but forget Hardware acceleration with those components. They need to udpated to be used with Stage3D, though that is now in the hands of the Apache Flex team, and Adobe holds no official responsibility. To my understanding at least.

– For Apps, AIR isn’t a bad option at all in these types of Apps. Titanium is comparable, and the performance is on par (with AIR 3.3 at least). Native Extensions has given AIR a lot of options to access native features, and there seems to be an active community (immune to all the bad mouthing of Flash) that have generated great extensions and driving the evolution of AIR for Mobile. And it’s easy to develop rich and fairly complex apps with AIR where titanium appcelerators starts getting very messy when apps tend to get large.

I’d have to agree, AIR3.3 on iOS (and android) is now a very compelling offering, the now depreciated GPU mode is fast (and easy) and especially when using Starling, or Stage3D. With the amount of libraries and components already existing for AS3, I’d put it up there with unity. I did notice this article was written back in 2011 though…

These kind of articles which are already over year old, shuold be updated. Because AIR new versions, the situtation is not anymore the same than it was year ago. So this article really gives wrong information if you dont notice the date when this is published. I would schoose AIR 3.5 because it rocks

I completely agree that this post needs to updated with the latest findings of all platforms. However, currently I’m not working with these tools on a regular basis to be able to make an educated guess as to how great these tools work for various projects. I’m sure Adobe AIR has improved much and the iPad 4’s improved specs will probably add to that. Same goes for the evolution of the PhoneGap and Titanium platforms. I’m sure much has changed and they all deserve a second review to see how great they are, compared to just 2-3 years ago.

Feel free to make your own writeup; I’d be more than happy to create a quick digest and link to your findings

Air changes lot… It can use now Stage3D what is native 3D (works on GPU)… It works fine on iPhone 3G, and iPad 1 too… It can use shaders… and there are some fantastic frameworks: Starling for 2D games, Away3D for 3D accelerated apps, Nips physics, AwayPhysics (based on Bullet engine). And now you can compile your OpenGL accelerated C (C++) based games to Flash, and it will works fine on Mobiles, Tablets, Browsers, Macs, PCs, Linux! (now comes the old Final Fantasys in Appstore, with these technics)

I also created the leap from Flash/AIR to CoronaSDK, and it instantly settled the performance problems we had. Although I skip AS3, you can crack together some pretty item focused composition structure with lua platforms. I really like the concept of Unity3D but do not like the move & fall design.

Follow me

Freelancer up for hire

Stay up to date

Stay in touch and get notified about some major new stuff in the future!

1793 Dooodls and counting!

I let people draw little doodles on my site. The one above is the latest one. If you want to, you can draw a Dooodl yourself and send it to me!
if you want to see them all 1793 of them, you can do that here.