So I know that adobe (or someone else) now provides a way to port your flex app to iphone. This seems to be a good solution when you want to create a multi-platform app that you can port to 3 top mobile OS. I am just wondering however. What are the downside? I am sure that doing it in flex is not as performant as doing it in obj-c or java. But how bad can it get? Are there other downside of doing it in Flex? (vs obj-c for iphone/java for android and bb)
What are the downside?
Here are a few considerations:
Performance is one consideration. It seems unlikely that Flash / AIR will ever run as as performant as an optimized Native application. That last part is not unique to mobile, though. The lower level you go, the better performance you can get. C will run better than ActionScript. Assembly code will run better than C. Machine code will run better than Assembly.
No Access to native APIs is another one. In-app billing and contacts are two common requests I see. AIR 3 has introduced Native Extensions as a way to combat this. However, to create a native extension you're going to have to write native code and compile it in a special way to expose it to the AIR runtime. It is possible, over time, that a bunch of people creative Native Extensions that you'll be able to use so you don't have to do the dirty work yourself.
The dependency on an external runtime is another limiting factor for some. What if the user has an old version of AIR and has issues installing your app? In AIR 3, Adobe introduced something called Captive Runtime to combat this. It bundles the runtime as part of the app. It adds about 8MB to the size of the app, but removes the external dependency. Captive Runtime is the only way to deploy to iOS.
Those are the primary limitations I see. I think building with Flex/Flash brings a lot of benefits, but biggest being the ability to deploy easily to multiple platforms. If you're already knowledgeable about Flash/AS3; building Mobile Apps with that seems like a logical choice.
You will surely have to fine tune your flex application to each platform if you want good performance.
You have to weight what is more important to you; going with flex will enable me to do one application and be able to use it on 3 platforms, meaning fast prototyping on all platforms but it might cause some headaches or do you want to write your application for each platform, making it more performant, robust and will be able to use platform specific features to your advantage?
You can start by doing a working prototype in flex, test it on the different platforms and eventually, if/as need be, build a platform specific along the way.
Related
I'm going to make a native (meaning; not in the browser) mobile app. Since I'm a web-developer I'm struggling to decide whether or not I should try Phonegap or just build an native app in java or objective-c.
The app requirements are simple. GPS/wifi location, Facebook integration and I guess I'll need a database to handle some of the application specific Facebook-friend relations. Like the highscores in a game, for example - stuff like that.
I'm a web-developer, and don't know neither java or objective-c, yet. I've never used Phonegap before, so I don't know if it's capable of fulfilling my requirements.
So my question is as follows;
Can I use Phonegap for my app, or do I need to dive into a new language?
Related:
Larger version of this article can also be found HERE, to be transparent it is my personal blog.
Hybrid vs Native apps
Hybrid apps:
Pro:
Quicker development, especially if you're a a longtime web developer.
1 language can be used on every available platform. This, of course, requires a Phonegap wrapper. You don't need to learn Objective C, Java, or C# to do any development. You need only to understand the basics of the Phonegap implementation. You will need to play with above-mentioned languages a bit but you don't need to understand them.
Phonegap can offer some native capabilities like iOS native tab bar or Android native tab bar and so much more.
Lower budget costs and a huge community of supporters and developers.
A hybrid app offers many of the advantages of both approaches access to the most common device APIs, and broad device coverage while not requiring the specialized skills, bigger budgets and longer time to market that are more typical of fully native apps.
Cons:
You will piss blood after some time, literally and metaphorically.
Mobile phones (even today's tablets) are not fast enough to smoothly run a hybrid app, mobile JavaScript capabilities are bed at best. Android platform is a nightmare, page transitions don't work smoothly not to mention lacking CSS/CSS3 implementation. If you think native Android 2.X and 4.X have differences take a look a Android 2.X bad JavaScript / CSS implementation. iOS fares better but still has a lacking CSS3 implementation thou much better page transitions. To make this short native apps will always have a better user experience and general feeling.
You will spend much more time fixing the app then building it. Creating an app for each and every platform is a pain in the neck. Browsers on different platforms do not uniformly support all the latest HTML features and APIs, which can make developing and testing a challenge.
If you don't have a good designer, don't even try to build an app; looks are everything.
If you don't know what are you doing there's a good chance your app will not get permission for Apple app store. Even Google Play Store will ban your app if they discover a 3rd party Phonegap PayPal plugin.
Native apps:
Pro:
A native mobile app can produce the best user experience — fast and fluid, can give you the best access to device features, and can be discovered in the app stores.
Without a doubt, native apps have full access to the underlying mobile platform. Native apps are usually very fast and polished, making them great for high performance apps or games. This is more then enough.
Cons:
Bigger budget, you will need at least a person/s with Java and Objective C knowledge, even C# if you want a Windows mobile app. Yes you can learn it yourself but don't live under the illusion you will do so in a short time. If you have never done any development, choose Objective C (iOS is still a better platform). In other cases choose Java. Java has a syntax similar to other available languages, so it is easy to jump from C# to Java and vice-versa. Objective C is a world of it own. It has a rather uncommon syntax.
It might take you a longer period of time to develop all of them and time is money. This depends on the complexity of the apps.
In your case, if you have a good web development/design skills and/or have a good designer you should choose a hybrid app. Go native only if this app is going to be a complex one. Everything you want can be done with a hybrid app. And you will find a great and supporting community.
Hybrid apps
What I didn't previously mentioned you need to be specially careful here. Even if you are seasoned developer you will find a lot of problems you can't solve. Hybrid development should not be mistaken for a basic web development.
Every mobile platform has its own set of problems, not to mention that mobile phones behave differently depending on a device. If possible always create a app that works on a slower devices because native app will successfully work on almost any device.
There's one last thing, when creating hybrid apps, app development will take you about 30%-50% of your time, rest goes to specific platform debugging and learning. Believe me, even after several years of mobile development sometimes I am facing problems I can't solve alone or fast enough.
So be careful when choosing mobile framework, pick 2-3 and spend several days reading about them.
Links
Here are few links to help you decide:
PhoneGap + jQuery Mobile 1.4 tutorial - This is a step by step tutorial for PhoneGap and last version of jQuery Mobile
PhoneGap + jQuery Mobile 1.4 tutorial - MacOS version - This is a step by step tutorial for PhoneGap deployment on MacOS. jQuery Mobile part is covered in a previous article, no point in repeating things.
jQuery Mobile vs Sencha Touch - jQuery Mobile Sencha Touch comparison
jQuery Mobile vs Kendo UI - jQuery Mobile Kendo UI comparison
7 best known HTML5 mobile frameworks - Name tells everything
7 less known HTML5 mobile frameworks - Name tells everything
if your application does't have animation effects and simple i prefer to create in a web(Phonegap) cz at less amount of time we can launch in multiple types of mobile OS.
if your app contain more UI effects and animation then it is best to go with native..
even though you develop in webview(Phonegap) you need learn some basic steps in Android and iOS
How Phonegap performs in devices
Ios
The animations and view loading in ios webview is stranded and good, the animation effects can observer clearly
Android
We have to consider the device version and device company for android while running the html code, Some high config devices in android give more clear and efficient animation display, but some devices (mostly old version and some company devices) cant give good animation effects, rendering effect varies from device to device in android,
In my humble opinion with Phonegap you can just develope simple apps, nothing more. The documentation is not enough and like others have said you will spend much more time fixing bugs and finding plugins than building your app. I would make the effort to learn Android or iOS or whatever, look at it as an investment of your time. (Yes, my comment is a little biased).
Last I looked into it PhoneGap was all html,css, and javascript. So, you may feel right at home. PhoneGap can handle GPS location, see this article from PhoneGap's documentation. Whether or not you want to pick up Objective C would depend on how fast you pick up new languages as it is a bit of a departure from web development.
It totally depends on your needs
After publishing my first app several months (native Android, database driven, restful connecting app), I decided to rewrite my app by using phonegap (since I want to clone the app to iOS, so instead of doing it in ObjC, why not javascript ?)
When on Android, it costed me, a Java developer, 3 weeks to learn and code everything from scratch. Banging my head to the wall several times for how to make the ListAdapter sync with the Restful Service from my server, how to theme the app (quite hard in my opinion, especially when it comes to special effects like transparent, border,...), and also, how to structure your code base effectively (if you are familiar with Java, you will find that all the classes are very coupled to each others, since that is what most of the tutorials write about)
When on Phonegap, everything is done in 1 week. Css, html, with onsenui and angular make the GUI development just like about 1 st year student 's assignment and theming is just a piece of cake. I don't need to run it on the real device, just use browser during the development, change code and refresh are enough. Angular provides 2 way binding with the DOM, and this makes a huge awesomeness when collecting and showing data. For example:
<ul ng-each="for sentence in sentences" >
<li>{{ sentence.title }} </li>
</ul>
When the variable sentences is changed (retrieved from server), the DOM is automatically changed as well. However, javascript is only javascript. I found myself struggling many time when debugging the app, especially when doing the MapReduce functions with PouchDB (big mistake, have to go back to cordova-sqlite-plugin tonight) and most of the time, I have to read the log in order to figure out the problem (Chrome 's tools and Firebug cannot catch the breakpoint). Also, it is hard to restructure your app (javascript, again) so if you don't organise carefully your code base at the first sign, you might end up with a mess (and debugging is a real pain, again). PhoneGap is also Web based, so sometimes, you will hear that "because on this platform, it does not support that bla bla bla" (e.g, localStorage) and you have to stand for it if you cannot find any good plugin.
Conclusion Except for the limitation of the web-based storage, PhoneGap works quite well with the database driven, simple GUI app (and most of the database driven apps currently has a simple GUI anyway). If you gonna develop that kind of app, then stick with it
check out using ionic, backed by angular.js to offset some of the cons mentioned in the accepted answer. Tutorial for launching an employee directory app: http://coenraets.org/blog/2014/02/sample-mobile-application-with-ionic-and-angularjs/
#Gajotres wrote a great response, but hybrid app performance has come a long way since 2012. I answered a related question that covers the difference between hybrid and native app development in 2017.
The moral of the story is that hybrid app development has improved tremendously in the past few years, but it still cannot match native for certain use cases.
With tools like Ionic (first released in 2013) and React Native (first released in 2015) it is easier than ever to build hybrid apps with native-like components. Hybrid apps are now faster, less buggy, and able to interact more deeply with the native UI.
The threshold for hybrid app performance is substantially higher than just a few years ago, but there is still a point at which you may need to develop your app in a native language.
Original Answer:
Yes, the general sentiment is that Hybrid apps are inferior to Native
apps. While this can be frustrating for developers more familiar with
web technologies, it does come for good reason:
Inability to interact with native components: Although plugins such as cordova-plugin-statusbar exist, there are limitations
interacting with and manipulating native components using web
technologies. One great (and frustrating) issue I have personally run
into is the inability to have an input at the top of they keyboard as
the keyboard animates in. This sounds like a nonissue until you look
at an app where this is an essential feature such as in a chat app
like Slack.
300ms delay: Although modern browsers are beginning to phase this
out,
the fraction of a second delay present on Hybrid apps makes the app
feel slow and non-native. This issue is becoming less of a factor as
more users adopt workarounds such as
FastClick.js and some
frameworks such as Ionic eliminate it
by default.
The haters are right (sort of): While Hybrid app development has come a long way, there are still minor glitches and laggy
functions that are just not present in a Native app. Screen
transitions, app switching, and battery life are still common areas
for bugs to appear and likely will be for some time, even if they are
starting to become less and less noticeable.
There are some great Native solutions: With newer languages such as Apple's Swift it is becoming easier to
code in a Native language. That being said, tools such as React
Native fall into a gray
area between Native and Hybrid by allowing developers to code in
friendly technologies such as JavaScript but compile into native code.
The moral of the story is that it really depends what is important to
your specific use case. Hybrid apps have become a viable option and
are no longer an embarrassing side show. Conversely, there are still
minor aspects of interacting with the Native UX that are not yet
possible except with a Native app.
Overall, I recommend mapping out your project and determining if your
app needs any of the benefits of a Native app. With tools such as
Ionic View app it is easy to put together a
basic mockup of your app and test on a real device whether or not a
Hybrid app will work for you.
There's also AppGyver Steroids that unites PhoneGap and Native UI very well.
With Steroids you can add things like native tabs, native navigation bar, native animations and transitions, native modal windows, native drawer/panel (facebooks side menu) etc. to your PhoneGap app. Basically, anywhere CSS + JS don't cut it, Steroids reaches into the native layer to perform the action.
Also, with steroids, you can (although you don't have to) use multi-page architecture (multiple webviews) rather than single. With single page apps, all things like transitions are just CSS workarounds, and as Mani said, even modern tablets and phones aren't fast enough to make them smooth. It's always obvious when it's a phonegap app, especially when you've got a bunch of processes going, or if you're scrolling since JS processes are haulted (being fixed in iOS 8).
Using the multi-page architecture means you get 100% native performance (because those parts actually are native). And unlike phonegap, you'll get consistent user interface behavior and easier debugging (with a single page app, it's often difficult to recreate a particular state in your app). Multi page makes it far easier to develop and maintain your apps since your codebase stays cleaner.
Check the demo: http://youtu.be/oXWwDMdoTCk?t=20m17s
I also find a every good article here http://www.comentum.com/phonegap-vs-native-app-development.html, it compares these two ways in different categories.
The summary is as below:
Design of Interfaces (Same)
Cost (Hybrid has Advantage)
Development Timeline (Hybrid has Advantage)
User Experience and Performance (Native has Advantage)
Maintainability (Same)
No Limitations (Native has Advantage)
Security (Same)
Support and Resources (Native has Advantage)
Tools and Debugging (Native has Advantage)
Platform Independent (Hybrid has Advantage)
Popularity (Same)
One overlooked of the great options here is development with Xamarin.
Though it doesn't help to utilize OP's web developer skills, it has many pros compared to PhoneGap and almost no cons.
Xamarin vs PhoneGap Pros:
Mature framework providing access to the most (if not all) native
features of mobile devices.
Learn only one language (C# for the most developers) for all mobile
platforms.
Have a performance of native apps on iOS/Windows Mobile (since app is compiled into the native code) and very close one on Android (it still compiles to a native APK, but has to have a thin wrapper that translates .NET class library API into Android classes API at the runtime).
Maintained by Microsoft which supports the overall generous quality of the
platform itself and development tools. For instance, you will use Visual Studio and it's probably the best IDE around and now has free Community edition with every feature available that you'll need for Xamarin development.
Xamarin vs PhoneGap Cons:
Needs some time investments for pure web developers to switch to C#
and Xamarin class library API.
Therefore, Xamarin is a very solid option for cross-platform development nowadays.
Can anybody give me some pointers when to us a native Android app and when to go for a Hybrid model using HTML5 ....can anyone tell the pros and cons of each model.
Choosing the native app means you target the specific device platform, but with a hybrid app you can target your user audience.
Pros of native app:
-outstandig UI effects (you should go this way in case of developing games)
Cons of native app:
-targeting more platforms means rewriting the app and maintaining more codebase
Pros of hybrid app:
-time-to-market factor
-low learning-curve (having experience in webdevelopment makes it even easier)
-normally it's easy to integrate with the customer's existing data-sources and workflows
Cons of hybrid app:
-having many years of experience in enterprise application development causes the feeling that the right dev-tools are still missing
More and more companies realize that HTML5 hybrid application model is essential to implement Line-of-Business application on mobile platform and you can find more-and-mode opensource libraries to build a really responsive app to your customers.
I can see only two risks of hybrid applications, which can be easily avoided:
-Developers often test hybrid applications in HTML5-capable desktop browsers. This can cause serious performance issues in the deployed application. So the dev-team should do day-to-day tests on real mobile devices.
-You can easily be stuck to a particular framework (Ex. Sencha Touch). Try to prefer using libraries to building application on a specific framework, so you can stay agile and adopt to changing business requirements quickly.
There are two schools of thought here..
1. cross platform is good
2. cross platform is the least of all things.
When you go for cross platform, you miss out on the specifics of the platform. Years ago I coded for blackberry, but opted to go with J2ME without the blackberry extensions.
This meant my code ran on most java phones. But at the same time, I couldn't make use of the file system on the blackberry, because there were no files in the J2ME world.
I could hand code buttons and draw on screen the way I wanted, but I couldn't make use of some of the RIM_JAVA screen classes.
So I got an app that looked and ran the same on smart phones, but didn't take advantage of the RIM hardware. It was a trade off that I was happy to make, because of my target users. If I'd needed some of the RIM specifics, though, I'd have had to have pulled them in, at the expense of a portable application.
It's a coin toss.. If you go with generic, then you get all the common and therefore reach a larger market. But at the same time you don't really get the most out of the hardware.
We will develop a, social network integrated mobile application which will need to access native device capabilities but 90% of the logic will be implemented in the HTML5/Javascript code posted by Ruby back end to the device. Thus, we would like to update or change the logic/GUI of the app without user involvement. We have strict deadline and have to support iOS, Android and Blackberry.
In this case, what approach would you recommend us? We considered the approaches below but could not decide since we do not have any experience with mobile development even if we are experienced in Ruby, C/C++, Java, Javascript, Flex.
Our considerations:
Develop native apps for each platform and embed the native browsers
to implement our logic, which can take too much time.
Use one of the frameworks for cross-platform development such as
PhoneGap or rhomobile. In this case, we are afraid of facing some performance issues. We would love to hear the experience of developers with those frameworks.
Use Adobe Air for accessing the device and its WebKit component for the rest.
First, I hope you understand that there is no simple answer. At this junction, having been looking at cross-platform solutions for mobile development for two years, I feel that in order to get fully native UI look, and to access all the device and UI features, one is forced to produce native application on each platform.
But, since you asked about cross-platform tools, here's a list of the main contenders:
Sencha http://www.sencha.com/products/touch “Sencha Touch is the world's first app framework built specifically to leverage HTML5, CSS3, and Javascript”
Dojo http://dojotoolkit.org “Dojo saves you time, delivers powerful performance, and scales with your development process”
Phonegap http://www.phonegap.com “PhoneGap is an open source implementation of open standards”
jQuery Mobile http://jquerymobile.com “Touch-Optimized Web Framework for Smartphones & Tablets A unified user interface system across all popular mobile device platforms”
Rhomobile http://rhomobile.com “Free and open source mobile application framework”
Titanium from Appcelerator http://www.appcelerator.com
There are plenty of comparisons online, including on SO, and this fellow actually tried to use several platforms, code included.
Anecdotally, I have seen Phonegap produce a rather iPhone-centric look, that may not mesh well with Android, plus showing performance problems when loading screens (there may be workarounds via pre-loading). Also, access to more complex devices was limited, or at least lagging. Rhomobile is a good fit for data-driven apps (simple display of large databases), but architecturally could show performance issues, so check for yourself. Personally I did not get into Sencha, Dojo seemed a little small, and Titanium showed dated architecture. So next time I'm attempting a cross-platform app, I'll give jQuery Mobile a serious try.
Let us know what you pick and how it works out.
Iam using this rhomobile rhodes for my cross-platform development App which will run in Android, Blackberry and iPhone.
We have developed application and sucessfully runned in all devices without any issues. we used ruby for backend webservice call, And remaining app is constructed with HTML5 and java Script. I didn't face any issues regarding rhomobile.
intially we faced memory issues, But later on we resolved this issue by implementing local storage for our App. For android it wont supports local storage so we used Rhom Storage only for Android Device.
Sounds like a project doomed to fail.
If I were you, I'd build a mobile-friendly site for all 3 platforms if deadline is tight. What native features do you even need, first off? If it's something like a camera, you're better off just build a native app for all 3.
I'm instructed to develop a project in such a way that it is available for iOS, Android and Blackberry OS platform all at once. A herculean task!! indeed...
I am searching for all the possible development platforms for this assignment. I came across Flex 4.5.1 and the initial thoughts are really positive. Somewhere in SO I read that flex applications suffer from code bloating problem. I dont want such solution; infact memory is an important concern for me.
I want to know which one of the following is the optimum approach:
Developing using OS specific SDK i.e. xCode for iPhone, Andriod SDK for Android.
Developing using Flex builder and ignore code bloating.
Using Flash Builder and developing application in ActionScript.
I would also love to know if there is any other platform / language / API available for me...
Thanks for your time,
Flash Player's ubiquitous delivery makes developing and packaging mobile applications easy; however, HTML5 / JavaScript platforms such as PhoneGap would also enable rapid cross platform delivery.
Flex is heavier than Pure ActionScript. Depending on what you're developing, Flash Professional or a pure ActionScript project in Flash Builder may meet needs in a very lean and performant manner.
few days back I also asked a similar question here on SO and unfortunately so far I have not got the answer I wanted. (question is still open and you can share your findings with me there..)
Regarding your questions about Flex 4.5.1, I would like to say it is very neat and nearly perfect programming platform and learning it is quite simple. The Support & training available from Adobe is just awesome. You can easily get confidence in just few weeks. See an Excellent Downloadable tutorial, I would suggest you follow it for initial weeks.
In Flex, We Program in .mxml files and ActionScripts(.as) ... *.mxml files are converted to ActionScript during compilation. To increase the efficiency you can directly program in ActionScripts once you understand how they actually work. (Which I am trying to learn now.)
I am not sure about C/ C++ but Flex definitely supports some other languages i.e. Java, PHP etc. For Java developers like me another surprisingly good thing is that Flex can be integrated with Spring also.
Share your findings about Flex..
There are a quite a few cross platform mobile development tools
phoneGap
Appcelerator
Rho mobile
Mosync
Sencha
Corona
WidgetPad
Each one has their own advantages and disadvantages. For example, the applications built using phoneGap uses a html view to show the UI while Appcelerator uses native UI components which offers better UI responsiveness. Some are free and some are not. So you need to decide on your requirements and choose a framework.
If you like HTML5/JavaScript and want to extend it with C++ then you should try MoSync, it gives you the flexibility to blend them all if you so like. You can find out more at mosync.com.
I am going to develop an application which will be cross platform and it will be released for IOS and Android.
My App will be using network connectivity and communicate with the server and it has to be fast, reliable and responsive.
So my Question is: If i choose Adobe Flex to build that app for IOS and Android, So will there be any performance issues?
If no then why people use xcode or android sdk?
What are the disadvantages of using Adobe Flex over xCode and Andoid SDK?
Generally speaking, if you use a cross-platform "write it once and build for many platforms" tool you likely will give up the ability to take advantage of some (or all?) device- or platform-specific features. You are, in effect, choosing a lowest common denominator sort of solution. That is to say, you have available to you only the platform features available on ALL the platforms you are targeting.
Building a native app -- that is, using Xcode to build an iOS app and using the Android SDK to build an Android app -- gives you complete access to all of a given platform's specific features and capabilities, thereby ensuring the best user experience on each platform.
This is now my opinion: Native apps are better, simply because they present the user with a native experience -- an experience that will feel familiar to them as a user of the platform. When you choose to use a cross-platform tool you are actively choosing to give your user a less-than-ideal experience on their device, but YOU saved some time (maybe) getting your app to market. Who's the winner?
In my job, my boss and I had a specific conversation about this. We have native iOS and Android apps, on purpose, because we didn't want to give up platform-specific features. We wanted each app to give the best experience it could on its platform. We specifically agreed that a cross-platform solution was not the way we wanted to go.
Depending on what you are building, Air is a great platform for developing cross-platform mobile applications. Despite recent news that the Flash player is no longer being developed for mobile browsers, the native story remains strong. Plus, having seen native IOS, native Android and Flex development, the Flex platform is much better when it comes to the ease of development. With high-level features like data binding, visual state management, a solid component/skinning model, transitioning model, etc, it is a generation or two ahead of iOS and Android (IMO).
If you are using Flex for mobile (iOS/Android/Playbook), you get a common look/feel across all mobile devices. #MarkGranoff suggested that the user experience is downgraded when using an approach, but I'd challenge that.
Although I agree that an out-of-the-box styling of the UI components in Air feels a tad off, I don't recommend that anyone build apps that way anyways. Instead, create an app that looks like your app. There have been many applications that don't conform to the native look/feel of iOS or Android but are still quality from an aesthetic and UX perspective.
There is something to be said for an app that looks/behaves the same across all platforms. I can tell you this much... the user doesn't really care. If it looks good, feels good and does what they want, they are happy.
The Flex Mobile SDK uses a lot of the same UI paradigms (especially in the soon-to-be-released version of the SDK) and it is getting better. I wouldn't discredit it. You can save a lot of money and time using something like Flex Mobile.
You can use Flex to compile to AIR for iOS or android.
The performance of AIR vs Objective C or Java is significantly slower.
The advantage of using AIR is to have one cod base delivered to two platforms.
But if you have the know-how, Objective C and Java are better suited to development on their respective platforms. However many successful apps have been launched on iOS and Android using AIR. If you want to know if it would work for you I would seek out those apps in iTunes and Android Market and see how they perform for you.
If you app is not a game it will likely work fine. And if you app is a simple game it could also work fine.
Also remember there are other multi=platform development tools to choose from, like phone gap, or appcellerator:
http://www.appcelerator.com/
http://phonegap.com/
or even Unity 3D:
http://unity3d.com/
UPDATE:
Since this original answer in Novemer 2011, Adobe has made significant improvements to AIR for iOS and Android. Petformance problems are negligible unless you are doign somethign very instinsive such as large image processing.
Likewise, Unity3D has improved a lot too. It's an excellent choice for games that are 2D or 3D.
if you are using Air to develop cross platform apps, you should notice the following facts:
1) you don't have access to native features (but you can use Air Native Extensions to by pass this problem)
2) performance is slower than native apps (but you can use Starling framework to use GPU power in devices which will increases the performance a lot!)
the bottom line is that building mobile apps using AS3 and Flex/Air SDK is the best solution you can think of and the performance if using starling is much higher than native apps!
I don't think you can use Adobe Flex on iOS. Another cross platform solution to investigate would be HTML5. If you can afford it, the best solution might be to implement it twice, once with xcode for iOS and once with Android for Android.