免责声明:我注意到了你提到的跨平台工具,但从未用过它们构建过任何东西。如果你仔细阅读本文,你可能会猜到我目前主要是一名Android开发者。
答案是:取决于情况。原生应用程序确实有优势,但问题在于你是否关心(或关心得足够),有没有负担去为多个平台开发。由于你没有提供关于你计划构建什么类型的应用程序的详细信息,我将给你一个我知道的概述。
我假设你谈论的是基于HTML的跨平台解决方案(如PhoneGap,Sencha和Rhodes),而不是面向跨平台游戏的平台,例如Corona SDK或Moai,也不是通过MonoTouch和Mono for Android时总是有趣的Mono。我还排除了不支持Windows Phone的Titanium。
我看到原生应用和这些HTML跨平台解决方案之间存在一些差距,如下所示:
- UI熟悉度
- 性能(特别是UI)
- 兼容性
- 调试
- 平台APIs
UI熟悉度
每个平台的用户都对某些功能有特定的期望。iOS应用程序通常具有某些UI模式(顶部带有左侧返回按钮的那条条、圆角表格/列表UI等),而Android应用程序可能具有另一种模式(例如ActionBar,它类似于iOS上的栏,但并不完全相同,或长按项目以获得上下文菜单),Windows Phone用户则拥有另一种模式(磁贴和全景视图)。如果使用相同的HTML UI,则可能无法利用这些UI模式。熟悉的UI模式使得应用程序对通常不会花费时间学习多个平台的用户更加直观和舒适。
性能
原生应用程序的另一个优势是性能,尤其是与UI相关的性能,包括原始图形渲染能力或计算能力。如果您的UI很简单,这可能并不重要,但如果您的UI复杂且动画效果较强,则某些内容可能无法流畅运行。这在Android中尤为明显,因为您有许多不同的设备,其中包括一些性能较低的设备。
兼容性
使用HTML跨平台工具的另一个缺点是,不同的手机以不同的方式处理HTML/CSS/JavaScript。这有点讽刺,因为HTML本质上是跨平台的,但另一方面,您仍然要面对烦人的设备依赖性问题。在Android中尤其如此,因为您有很多不同的设备,并且制造商喜欢为某些原因调整WebView的实现。您最终会遇到某些设备出现奇怪问题的小错误。如果完全使用原生应用程序,则通常具有更好的兼容性(当然,代价是需要投入更多的工作)。对Android的旧版本的支持也往往不足。
调试
在移动平台上,调试JavaScript并不是一种非常愉快的体验。你最终会通过控制台进行大量的日志记录。虽然这可行,但肯定不如逐行跟踪代码那样好。在这方面似乎已经有了一些进展(例如可以参考名为weinre的工具),但我还没有深入研究过,因此无法对其优劣做出评论。
不仅这种调试方式更加困难,而且发现错误也更难。除非手动捕获和记录它们,否则JavaScript代码中的错误不会出现在日志中。结果可能是某些东西默默地失败了。
平台API
一般来说,你提到的这些主要厂商都有相当不错的硬件支持。像相机、GPS和本地存储等功能对于应用程序开发人员来说非常重要,因此它们会包含这些功能。如果您想获取完整的功能列表,您可能需要访问每个平台的网站(例如,这里是PhoneGap按平台的高级特性支持表),但通常大多数你所想到的"手机功能"都在那里。即便如此,就我所知,这些框架仍有许多更复杂的事情无法完成或者做得不太好,尤其是与手机功能关系不大而与平台相关的事情。线程处理就是其中一个例子。