电晕,Phonegap,titanium之间的比较

我是一个Web开发人员,我想将我的Web产品移到iPhone上。 其中一个产品就像谷歌地图:在手机屏幕上显示地图,您可以拖动或调整地图的大小,并查看我们添加到地图的一些信息。

我知道有一些技术可以让你使用HTML,CSS和Javascript开发原生的iPhone应用程序。 我已经确定了几个:

  • 安斯卡移动
  • PhoneGap的
  • Appcelerator的

还有其他类似的产品吗? 他们之间有什么区别? 我应该select哪一个?

我注册与stackoverflow只是为了评论大多数投票答案的顶部。 不好的一点是,stackoverflow不允许新成员发表评论。 所以我不得不把这个评论看成是一个答案。

Rory Blyth的答案包含了关于这两个javascript移动框架的一些有效的观点。 但是,他的关键点是不正确的。 事实是,titanium和PhoneGap比不同。 他们都通过一组JavaScript API暴露手机function,而应用程序的逻辑(html,css,javascript)在原生的WebView控件中运行。

  1. PhoneGap不只是一个Web应用程序的本地包装。 通过PhoneGap JavaScript API,“networking应用程序”可以访问手机function,如地理位置,加速计摄像头,联系人,数据库,文件系统等。基本上,手机SDK提供的任何function都可以“桥接”到JavaScript的世界。 另一方面,在移动Web浏览器上运行的普通Web应用程序无法访问大部分这些function(安全性是主要原因)。 因此,PhoneGap应用程序比Web应用程序更适合移动应用程序。 您当然可以使用PhoneGap来包装一个根本不使用任何PhoneGap API的Web应用程序,但这不是PhoneGap的创build目的。

  2. titanium不编译你的HTML,CSS或JavaScript代码到“本地位”。 它们被封装为可执行包的资源,就像embedded式图像文件一样。 当应用程序运行时,这些资源被加载到UIWebView控件中,并在那里运行(当然,不是本地位)。 JavaScript-to-native-code(或to-objective-c)编译器没有这样的东西。 PhoneGap也是这样做的。 从架构的angular度来看,这两个框架非常相似。

现在,他们有什么不同? 是。 首先,Titanium似乎比PhoneGapfunction更丰富,将更多的手机function连接到了JavaScript。 最明显的是,PhoneGap不会将很多(如果有的话)本机UI组件暴露给javascript。 titanium,另一方面,有一个全面的UI API,可以调用JavaScript来创build和控制各种原生的UI控件。 利用这些UI API,Titanium应用程序可以看起来比PhoneGap应用程序更“原生”。 其次,PhoneGap比Titanium支持更多的手机平台。 PhoneGap API更为通用,可用于iPhone,Android,Blackberry,Symbian等不同的平台。titanium至less主要针对iPhone和Android。 它的一些API是平台特定的(如iPhone UI API)。 使用这些API将降低应用程序的跨平台function。

所以,如果你对你的应用程序的关注是为了让它更“本土”,titanium是一个更好的select。 如果您希望能够更轻松地将您的应用“移植”到另一个平台,那么PhoneGap会更好。

Updated 8/13/2010: 链接到titanium员工的答案米奇的问题。

更新12/04/2010:我决定给这个职位每年审查,以保持其当前信息。 许多事情在一年中发生了变化,使得最初的一些信息已经过时。

最大的变化来自Titanium。 今年早些时候,Appcelerator发布了Titanium 1.0,从架构的angular度来看,它离开了之前的版本。 在1.0中,UIWebView控件不再被使用。 相反,您可以为任何UI函数调用Titanium API。 这个变化意味着一些事情:

  1. 您的应用界面变得完全原生。 在您的应用程序中没有更多的networking用户界面,因为原生的Titanium API接pipe了您所有的用户界面需求。 titanium在“跨平台本地用户界面”的前沿开创了值得信赖的地位。 它使程序员更喜欢本地UI的外观和感觉,但不喜欢官方的编程语言。

  2. 您的应用程序中将无法使用HTML或CSS,因为网页视图不见了。 (注意:您仍然可以在Titanium中创buildWeb视图,但是在Web视图中可以利用的Titaniumfunction很less)。 titanium问答:HTML和CSS发生了什么变化?

  3. 你将无法使用stream行的JS库,如假设存在DOM对象的JQuery。 您继续使用JavaScript作为您的编码语言。 但是,如果您作为networking​​程序员来到Titanium 1.0,那么这就是您可以使用的唯一networking技术。

titaniumvideo:titanium1.0什么是新的。

现在,Titanium 1.0是否将JavaScript编译为“本地位”? 不,Appcelerator终于在这个开发人员的博客中清楚了这个问题: Titanium Guides Project:JS Environment。 我们的程序员比市场部门的人更真实,不是吗? 🙂

转到PhoneGap。 PhoneGap没有太多新东西要说。 我的看法是,直到今年晚些时候IBM跳槽之后,PhoneGap的发展还不是很活跃。 有人甚至认为,IBM为PhoneGap贡献了比Nitobi更多的代码。 这是真的,不知道,PhoneGap正在积极开发。

PhoneGap继续以Web技术为基础,即HTML,CSS和JavaScript。 看起来PhoneGap并没有像Titanium那样将原生UIfunction与JavaScript结合在一起的计划。 虽然Web UI在性能和原生外观方面仍然落后于原生UI,但这种差距正在迅速缩小。 networking技术有两种趋势确保移动networking用户界面在性能方面具有明显的特点:

  1. JavaScript引擎从解释器转移到虚拟机。 JIT编译为本地代码以加快执行速度。 Safari JS引擎:SquirrelFish Extreme

  2. 网页渲染从依靠CPU转向使用GPU加速。 在硬件加速的帮助下,页面转换和三维animation等graphics密集型任务变得更加顺畅。 Chrome中的GPU加速合成

源自桌面浏览器的这些改进正在迅速地提供给移动浏览器。 事实上,自从iOS 3.2和Android 2.0以来,移动网页视图控件已经变得更加完善和HTML5友好。 移动networking的未来如此有希望,以至于它已经吸引了一个大城市: JQuery最近宣布了其移动Web框架。 JQuery Mobile提供用户界面小工具,PhoneGap提供手机function,两者相结合创造了一个完美的移动networking平台,在我看来。

我还应该提到Sencha Touch作为另一个移动Web UI小工具框架。 Sencha Touch版本1.0最近在包含GPLv3的双重许可模式下发布。 Sencha Touch就像JQuery Mobile一样,可以很好地与PhoneGap配合使用。

如果你是一个GWT程序员(像我),你可能想看看GWT Mobile ,一个用GWT创build移动web应用的开源项目。 它包含一个PhoneGap GWT包装器,可以在GWT中使用PhoneGap。

从我所搜集的内容来看,这两者之间有一些分歧:

  • PhoneGap基本上为仍然是web应用的东西生成本地包装。 它吐出一个WhateverYourPlatformIs项目,你build立它,并部署。 如果我们谈论的是iPhone(这是我花费我的时间),似乎与创build一个Web应用程序启动器(一个获取自己的跳板图标的快捷方式,所以你可以启动它像( )一个本地应用程序)。 “app”本身仍然是html / js /等,并在托pipe浏览器控件中运行。 除此之外,PhoneGap提供的是JavaScript和本地设备API之间的桥梁。 因此,您可以针对PhoneGap API编写JavaScript,然后PhoneGap会进行相应的本机调用。 在这方面,它不同于部署一个普通的旧的Web应用程序。

  • titanium源被编译成本地位。 也就是说,你的html / js /等等。 不是简单地附加到一个项目,然后托pipe在一个Web浏览器控制 – 它们被转换成本地应用程序。 这意味着,例如,您的应用程序的界面将由本地 UI组件组成。 有没有一个本地的应用程序获得本机的外观和感觉的方式,但是…嗯…通常是一个噩梦。

这两者的相似之处在于,您可以使用典型的Web技术(html / js / css / blah等等)编写所有内容,并且可以通过自定义JavaScript API访问本地function。

但是,PhoneGap应用程序(PhonGapps?我不知道…是一个愚蠢的名字吗?这很容易说 – 我知道这么多)作为Web应用程序开始他们的生活,并结束他们的生活作为Web应用程序。 在iPhone上,你的HTML / JS /等。 只是在一个UIWebView控件中执行,而您的js调用的PhoneGap JavaScript API则被路由到本机API。

titanium的应用程序成为本地应用程序 – 他们只是开发使用Web开发技术。

这实际上什么意思

  1. 一个titanium应用程序将看起来像一个“真实”的应用程序,因为,最终,它一个“真实”的应用程序。

  2. PhoneGap应用程序看起来像一个托pipe在浏览器控件的Web应用程序,因为它最终一个托pipe在浏览器控件中的Web应用程序。

哪个适合你?

  • 如果你想使用web开发技巧编写本地应用程序,titanium是你最好的select。

  • 如果你想写一个应用程序使用网页开发技能,你可以实际部署到多个平台(iPhone,Android,黑莓,和其他任何他们决定包括),如果你想访问的本地平台function的一个子集(GPS,加速计等)通过统一的JavaScript API,PhoneGap可能是你想要的。

你可能会问:为什么我要编写一个PhoneGapp(我决定使用这个名字),而不是一个Web上托pipe的Web应用程序? 我还能不能以这种方式访问​​一些本地设备function,但也有真正的Web部署的便利,而不是强迫用户下载我的“本机”应用程序并安装它?

答案是:因为您可以将您的PhoneGapp提交给App Store并收取费用。 你还会得到这个启动器图标,这使得用户忘记你的应用程序变得更加困难(我更可能忘记书签而不是应用程序图标)。

你当然可以收取访问你的网站托pipe的networking应用程序,但有多less人真的要通过这个过程来做到这一点? 随着应用程序商店,我select一个应用程序,点击“购买”button,input密码,我完成了。 它安装。 几秒钟后,我正在使用它。 如果我不得不使用别人的一次性移动networking交易界面,这可能意味着不得不挖出我的名字,地址,电话号码,抄送号码和其他我不想要的东西,我几乎可以肯定,不要经过它。 另外,我相信苹果 – 我相信史蒂夫乔布斯不会logging我的信息,然后向我的CC收取一堆淘气的杂志订阅踢。

无论如何,除了涉及networking开发技术的事实之外,PhoneGap和Titanium是非常不同的 – 只不过是表面上可比的。

我讨厌networking应用程序,如果你阅读iTunes App Store的评论,用户很好的发现他们。 我不会命名任何名称,但是我的手机上有一些“应用程序”,它们看起来像垃圾一样运行,这是因为它们是在UIWebView实例中托pipe的Web应用程序。 如果我想使用一个Web应用程序,我会打开Safari,并且,导航到一个。 我买了iPhone,因为我想要的是iPhone-y的东西。 在Safari中使用时髦的Google Web应用程序,我没有任何问题,但是如果Google只是通过将Web应用程序作为本地应用程序呈现给Springboard,那么我会感到被欺骗。

要离开了。 我的女朋友可以让你停下来,用三秒钟的时间看她的脸。

我正在开发Android / iPhone开发课程,我们花了8个星期的titanium(不是全职)(版本是titanium1.4.2,时间大约在2010年11月)。 这是我的经验。

iPhone Android双目标

尽pipeAPI指南声称Android和iPhone都具有该function,但事实并非如此。 大部分的东西根本不适用于其中一个平台。 有些事情工作不同。

很多class上的人都做了iPhone应用程序,不能在没有大的改写的情况下在Android上工作。 我开发了一个名为Animap的简单的儿童应用程序(参见瑞典的android market / Appstore),并开始在Windows下开发。 一旦Android目标正在工作,我就在OS X上打开了这个项目。它没有显示iPhone的任何构build东西,只是为了Android。 你需要在OS X下启动一个双目标项目(好吧,我把相关文件复制到一个新项目中)。 下一个问题 – animation不适用于iPhone(他们在Android上工作)。 iPhone上的滚动事件不起作用。 (即在Android上,当用户停止滚动并从屏幕释放他们的手指时,您将获得未触摸事件,这在iPhone上不会发生)。

由于这个地方没有提到,所以基本上需要在第一个平台上进行试错编程,然后在另一个平台上进行试错。 通过试验和错误我的意思是大约需要两天才能得到像Animap这样的简单的应用程序在另一个平台上工作。 你也将需要如果(Android)然后…或如果(iPhone)…所有的代码…

下载并安装

你必须按照信的指示。 不要试图使用Java 64位。 它不会编译KitchenSink 1.4.0演示应用程序。 (1.3工作正常!)您必须将文件直接放在C驱动器上,因为长时间的path名会使外部程序长时间不能接收所有的命令行参数。 (虽然对于小程序来说很好)三分之一的时间,工具链只是停下来,你必须再次按“启动”。 那么它可能会工作…非常不可靠。 模拟器将不会在启动时被发现,然后你必须简单地杀死adb.exe与Ctrl + Alt + Delete然后重试。

networking连接

在无线networking中,有时会丢失实时连接,而Titanium会崩溃(编译/部署接口)如果您没有可用的Internet连接,它将无法启动,因为它无法将您login到其服务器。

API

与此相比,CSS,HTML和jQuery是一件轻而易举的事情。 titanium像其他任何老的GUI API,你需要为每个button/字段/等设置一些属性。 获得一个字段错误只是为了简单,记住所有需要设置的属性? 你在正确的地方拼写大写字母吗? (因为这不是被编译器捕获的,但是如果你很幸运地testing那个部分的话会被视为运行时错误)

在Titanium中,当您在控件的顶部添加另一个视图或在GUI中的其他位置单击时,事物就会中断。

文档

几个API页面带有Android符号,但只有在您尝试创build控件时才返回null。 尽pipe有这些符号,但并不是简单地在Android平台上提供。 有时候Android会提到不支持特定的方法,但是整个API都会丢失。

厨房水槽

演示应用程序。 我提到它不会编译,如果你把它放在你的Eclipse项目文件夹,因为path太长? 必须放在你的C盘根目录下。 我目前使用一个symbolik链接(mklink / J …)

未logging的方法

你必须使用label.setText('Hello World')来改变一个标签的可靠性,但是这一切都没有logging。

debugging

Titanium.API.info('打印输出是唯一的方法来debugging');

编辑

这些API没有任何好的格式,所以你不能在Eclipse中获得普通的代码完成。 Aptana请帮帮忙!

硬件

看起来,编译器/工具不是multithreading的,所以一个快速硬盘的快速计算机是必须的,因为你必须做大量的试验和错误。 我提到了糟糕的文档吗? 你必须尝试一切,因为你不能相信它!

一些积极的事情

  • 开源
  • 从以前的项目中,我承诺自己再也不会使用封闭源码了,因为你不能仅仅通过投入时间和人力来解决问题。 重要的是,当你在项目中迟到,需要交付一个艰难的最后期限。 这是开源的,我已经能够看到为什么工具链断裂,并且实际上修复它。

  • Bugdatabase

  • 它也是开放的。 你可以简单的看到,你并不孤单,做一个解决方法,而不是另外4个小时的试验和错误。

  • 社区

  • 似乎是积极的在他们的论坛上。

错误

  • titanium1.4不是线程安全的 。 这意味着如果你使用线程(在一个createWindow调用中使用url:属性),程序就像线程正在工作,并用数据来回发送事件,你会遇到很多非常非常奇怪的东西 – 丢失的处理程序,丢失窗口,太多的事件,太less的事件等等。这一切都依赖于时间安排,以不同的顺序放置代码行可能会崩溃或治愈您的应用程序。 在另一个file.js文件中添加一个窗口会破坏你的app.js文件的执行…这也会破坏Titanium中的内部数据结构,因为它们有时可以用并行方式更新内部数据结构,用别的东西覆盖刚才改变的值。

Titanium的许多问题来自于我的OSE等实时系统的背景,他们支持数百个线程,事件和消息传递。 这应该在titanium1.4工作,但它不是可靠的。

  • Javascript(这对我来说是新的)在运行时错误无声无息地死亡。 这也意味着小的和常见的错误,比如拼错一个variables名或者读入一个空指针不会崩溃,所以你可以debugging它。 相反,部分程序停止工作,例如事件处理程序,因为您错误地放置了/错误input了字符。

  • 那么我们在Titanium中会有更多简单的错误,就像一些参数不能在函数中工作一样(这在Android平台上至less是常见的)。

  • 试用和错误debugging循环速度在几台计算机上运行Titnium Developer后,我注意到瓶颈是硬盘驱动器。 笔记本电脑上的SSD驱动器的构build周期比在4200 rpm驱动器上快3-5倍。 在桌面上,具有RAID 1(条带化模式)的双驱动器使其构build速度比使用更快的CPU的单个驱动器快25%,同时也击败了SSD驱动器笔记本电脑。

概要

  • 从这个线程的评论看来,这样的工具可以提供应用程序的平台数量的斗争。 API的数量似乎是关键的卖点。

当你开始使用它的时候,这非常闪耀。 如果你看看开放的错误跟踪器,你会发现错误的数量比固定错误的数量增加得更快。 这通常是开发人员不断增加更多function的标志,而不是专注于获取更多的错误。

作为一名顾问,他们试图为客户提供相当简单的应用程序到多平台 – 我不确定这实际上比在两个平台上进行本地应用程序开发要快。 这是因为,当你加快速度的时候,你很快就会使用Titanium,但是随后你突然往下看,发现自己陷入了一个如此之深的洞中,你不知道必须花费多less时间来解决这个问题。 你可以简单地不承诺某个特定的function在一定的期限/时间/成本。

关于我自己:用wxPython使用Python两年。 (这个GUI是不稳定的,但从来没有像这样打破过,可能是我没有理解Javascript和Titanium使用的线程模型,但是我并不孤单,根据他们的公开讨论论坛,GUI对象突然使用错误的上下文/不更新.. ???)之前,我有一个在移动设备的C和ASM编程的背景。

[编辑 – 添加错误的部分,而不是线程安全的] [编辑 – 现在已经使用了一个月+,主要是在PC上,但也有一些在OS X上。 增加了iPhone和Android双重目标。 增加了试用和错误debugging循环速度。]

Corona SDK(Ansca Mobile)使用Lua作为其编码语言。 有关Lua的更多信息,请参阅lua.org。

虽然我们计划进一步添加Web集成和本地UI元素,但我们的重点将集中在graphics密集型应用程序上,如游戏开发,而不是基于Web的技术。 换句话说,我们没有设想完全用Javascript / HTML / CSS编写Corona应用程序的人。

我一直在使用Titanium已经一个多星期了,觉得我对它的弱点有很好的感觉。

1)如果你希望你在多个平台上使用相同的代码,祝你好运! 你会看到一些像backgroundGradient和惊讶,直到你发现Android版本不支持它。 然后必须恢复使用渐变图像,不妨使用它的两个版本,使代码更容易的权利?

2)很多奇怪的行为,在Titanium的android sdk上,你需要了解什么是“沉重的”窗口,只是让后退button工作,甚至更好的定位事件跟踪。 这不是android平台的真正目的,它只是如何titanium试图使他们的API工作。

3)你在黑暗中投掷事物会崩溃,你必须开始评论代码,然后当你find它,永远不要使用它。 有一些明显的错误,比如android上的方向和百分比,已经有六个多月的问题了。

4)错误….有很多的错误,他们将被报告,坐几个月,几天后得到修复。 我很惊讶,他们甚至计划发布一个黑莓的移动SDK当有这么多的其他问题与Android。

5)titaniumiPhone与titaniumAndroid的JavaScript引擎是完全不同的。 在Android版本上,你可以下载远程JavaScript文件,包括和使用像mootools,jQuery等库。 我在天堂,当我发现这一点,因为我不必编译我的Android应用程序。 Android apk安装过程需要这么长时间! Iphone没有可能,也是iPhone版本有一个更快的JavaScript引擎。

如果你远离了很多本地UI部分,也就是使用setInterval检测方向的变化,坚持使用渐变图像,忘记后退button,build立自己的animation,忘记窗口标题,工具栏和仪表板。 你真的可以做一个API,这两个都不需要很多重写。 但在这一点上,它就像一个Web应用程序一样缓慢。

那么值得吗? 毕竟痛苦,它的价值每一分钟。 你可以抽象的逻辑,只是build立不同的用户界面,而不是到处都是。 titanium可以让你做stream体应用,感觉很快。 你失去了每个平台的强大的布局能力,但如果你认为简单,事情可以用一种语言来完成。

为什么不是一个Web应用程序 在入门级市场上,android手机生成一个webview的速度非常慢,并且消耗了大量的内存来完成更复杂的逻辑。

以下是Appcelerator和PhoneGap的最新和深入的分析: http : //savagelook.com/blog/portfolio/a-deeper-look-at-appcelerator-and-phonegap

以下是关于它们如何以编程方式不同的更多细节: http : //savagelook.com/blog/portfolio/phonegap-is-web-based-appcelerator-is-pure-javascript

Titanium支持本地mapkit

让HTML5小部件看起来像iPhone小部件是一回事,但使它们同样好的performance完全是另一回事。 html5animation的效果(即使是简单的视图转换),滚动长列表,响应手势感觉粘性和生涩。 iPhone用户会注意到不同之处。

不同设备所支持的手势types也存在一些差异,从而导致平台特定的代码和可用性问题。

现在我想我会留在原生应用程序。

Rhomobile Rhodes( http://rhomobile.com/products/rhodes )与PhoneGap的方法非常相似,但是它是唯一的框架:

  1. 模型视图控制器模式(大多数Web框架提供)
  2. 一个对象关系pipe理器
  3. 支持所有stream行的智能手机(包括Windows Phone 7)
  4. 一个托pipe开发服务(不只是托pipe构build): http : //rhohub.com
  5. RhoStudio IDE中的完整debugging器和无SDK的仿真器
  6. 支持同步的离线数据

对于任何对Titanium感兴趣的人,我必须说他们没有很好的文档,一些类,属性,方法都没有。 但是KitchenSink的示例应用程序中有很多“logging”,所以它不是那么糟糕。

我对PhoneGap的理解是,他们为大部分的iPhone API提供了JavaScript API。

对于Web开发人员背景,titanium似乎更容易。 这是一个简单的XML文件,用于创build基本的TabView应用程序,然后内容区域中的所有内容都由HTML / JS控制。 我也知道,titanium提供了一些JavaScript访问一些框架(特别是访问位置信息,电话ID等)。

更新:Titanium在其框架的0.8版本中添加了Maps API。

你应该学习目标C和程序本地应用程序。 不要依靠这些你认为会让生活更轻松的事情。 苹果已经确定最简单的方法是使用他们的本地工具和语言。 对于你的100行javascript,我可以在3行代码中完成相同的操作,也可以根据元素完成任何代码。 观看一些教程 – 如果你了解JavaScript,那么客观的C是不难的。 变通办法是悲惨的,苹果可以随时随地拉你的插头。

在你提到的解决scheme中,没有一个能让你直接访问OS 3.0中引入的MapKit框架。

由于Google Maps HTML小部件几乎不如MapKit(例如,参见谷歌纵横),您可能最好是开发本地Cocoa触摸应用程序,或者select可以扩展以添加MapKit集成的解决scheme。 PhoneGap可以以这种方式扩展(它是开源的,所以它是默认的),其他一些解决scheme也可以。

编辑:Titanium现在支持MapKit

我试过电晕。 这是很好,直到我发现它不支持stream式MP3audio。 所以,我就在那里停了下来。 我想如果我真的想成为一个iphone应用程序开发人员,我应该学习obj c。 所有我想做一个应用程序,其中有一个广播电台列表,你点击它们开始播放。