比较Corona, Phonegap, Titanium

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

我知道有一些技术可以让你使用HTML、CSS和Javascript来开发原生iPhone应用。我列举了一些:

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

212309 次浏览

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

由于谷歌Maps HTML小部件远不如MapKit(参见谷歌Latitude的例子),您可能最好开发一个原生Cocoa触摸应用程序,或者选择一个可以扩展以添加MapKit集成的解决方案。PhoneGap以这种方式是可扩展的(它是开源的,所以默认是),其他一些解决方案可能也是如此。

编辑:Titanium现在支持MapKit

据我所知,这两者之间有一些不同之处:

  • PhoneGap基本上为web应用程序生成本地包装器。它吐出一个WhateverYourPlatformIs项目,您构建它并部署它。如果我们谈论的是iPhone(这是我花时间的地方),它似乎与创建一个web应用启动器(一个拥有自己的Springboard图标的快捷方式,所以你可以像(like)一个原生应用一样启动它)没有太大区别。“应用程序”本身仍然是html/js/etc。,并在托管的浏览器控件中运行。PhoneGap提供的是JavaScript和本机设备api之间的桥梁。因此,你针对PhoneGap api编写JavaScript,然后PhoneGap做出相应的本机调用。在这方面,它 不同于部署一个普通的旧web应用程序。

  • 钛源被编译成本地位。也就是你的html/js/等等。它们不是简单地附加到一个项目,然后托管在一个web浏览器控件中——它们被转换成原生应用程序。这意味着,例如,你的应用程序的界面将由本机 UI组件组成。有很多方法可以在没有原生应用程序的情况下获得原生的外观和感觉,但是……嗯…这通常都是一场噩梦。

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

但是,同样,PhoneGap应用程序(PhonGapps?我不知道……这名字蠢吗?说起来容易些——我知道这么多)以网络应用开始他们的生活,以网络应用结束他们的生活。在iPhone上,html/js/等等。只是在UIWebView控件中执行,PhoneGap JavaScript api你的js调用被路由到本地api。

钛应用变成了原生应用——它们只是使用web开发技术开发的。

这个的意思是实际上是什么?

  1. Titanium应用将看起来像一个“真正的”应用,因为最终,它是一个“真正的”应用。

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

哪一种适合你?

  • 如果你想使用web开发技能编写本地应用程序,Titanium是你最好的选择。

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

你可能会问:为什么我要写一个PhoneGapp(我决定使用这个名字),而不是一个托管在网络上的web应用程序?我是否仍然可以通过这种方式访问一些原生设备功能,同时也拥有真正的web部署的便利,而不是强迫用户下载我的“原生”应用并安装它?

答案是:因为你可以将你的PhoneGapp提交到App Store并收费。你还会看到启动器图标,这让用户更难忘记你的应用(比起应用图标,我更容易忘记书签)。

你当然可以对你的web托管web应用程序的访问收费,但有多少人真的会这么做呢?在App Store中,我选择一个应用程序,点击“购买”按钮,输入密码,就完成了。它安装。几秒钟后,我开始使用它。如果我不得不使用别人的一次性移动网络交易界面,这可能意味着我必须输入我的姓名、地址、电话号码、CC号和其他我不想输入的东西,我几乎肯定不会这么做。而且,我相信苹果——我相信史蒂夫·乔布斯不会记录我的信息,然后向我的抄送中心收取一堆顽皮的杂志订阅费。

不管怎样,除了涉及到web开发技术之外,PhoneGap和Titanium是非常不同的——只有表面上的可比。

顺便说一句,我讨厌网页应用,如果你阅读iTunes App Store的评论,你会发现用户很擅长发现它们。我就不点名了,但我手机上有几个“应用程序”看起来和运行起来都像垃圾,这是因为它们是在UIWebView实例中托管的web应用程序。如果我想使用网络应用,我会打开Safari,然后导航到一个。我买iPhone是因为我想要iPhone风格的东西。比如说,我在Safari中使用一个时髦的谷歌web应用程序没有问题,但如果谷歌通过将一个web应用程序作为原生应用程序来呈现,将一个书签偷偷地放到Springboard上,我会觉得被欺骗了。

我得走了。我女朋友脸上有一种"拜托你别再用电脑三秒钟"的表情。

我对PhoneGap的理解是他们为很多iPhone api提供Javascript api。

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

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

你应该学习objective - c和编程原生应用程序。不要依赖这些你以为会让生活更容易的东西。苹果确保最简单的方法就是使用他们的本地工具和语言。对于你的100行javascript,我可以在3行代码中做同样的事情,或者完全不需要代码,这取决于元素。看一些教程——如果你理解javascript,那么objective - c并不难。变通办法很糟糕,苹果可以随时把你的插头拔掉。

我在stackoverflow上注册只是为了评论上面投票最多的答案。糟糕的是,stackoverflow不允许新成员发表评论。所以我必须让这个评论看起来更像一个答案。

Rory Blyth的回答包含了关于这两个javascript移动框架的一些有效观点。然而,他的关键点是不正确的。事实是,Titanium和PhoneGap大同小异。它们都通过一组javascript api公开手机功能,应用程序的逻辑(html, css, javascript)在原生WebView控件中运行。

  1. PhoneGap不仅仅是一个web应用程序的原生包装。通过PhoneGap javascript api,“web应用程序”可以访问手机功能,如地理定位,加速计相机,联系人,数据库,文件系统等。基本上,手机SDK提供的任何功能都可以“连接”到javascript世界。另一方面,在移动web浏览器上运行的普通web应用程序无法访问大多数这些功能(安全是主要原因)。因此,PhoneGap应用程序更像是一个移动应用程序,而不是一个web应用程序。你当然可以使用PhoneGap来包装一个不使用任何PhoneGap api的web应用程序,但这不是PhoneGap创建的目的。

  2. 钛不编译你的html, css或javascript代码到“本地位”。它们被打包为可执行包的资源,很像嵌入式图像文件。当应用程序运行时,这些资源被加载到UIWebView控件中并在那里运行(作为javascript,当然不是本地位)。javascript- native-code(或objective-c)编译器是不存在的。这在PhoneGap中也是以同样的方式完成的。从架构的角度来看,这两个框架非常相似。

现在,它们有什么不同吗?是的。首先,Titanium似乎比PhoneGap的功能更丰富,它将更多的手机功能连接到javascript。最值得注意的是,PhoneGap并没有向javascript公开许多本地UI组件(如果有的话)。另一方面,Titanium有一个全面的UI api,可以在javascript中调用,以创建和控制各种原生UI控件。利用这些UI api, Titanium应用程序看起来比PhoneGap应用程序更“原生”。其次,PhoneGap比Titanium支持更多的手机平台。PhoneGap api更通用,可用于不同的平台,如iPhone, Android,黑莓,塞班等。至少目前,Titanium主要面向iPhone和Android平台。它的一些api是特定于平台的(如iPhone UI api)。使用这些api会降低应用程序的跨平台能力。

所以,如果你想让你的应用看起来更“原生”,Titanium是一个更好的选择。如果你想更容易地将你的应用“移植”到另一个平台,PhoneGap会更好。

< >强8/13/2010更新: 链接到一名钛员工对米奇问题的回答。 < / p >

< >强12/04/2010更新: 我决定给这篇文章一个年度审查,以保持其信息的最新。一年中很多事情都发生了变化,使得最初的帖子中的一些信息过时了

最大的变化来自钛金属。今年早些时候,Appcelerator发布了Titanium 1.0,从架构的角度来看,它与之前的版本有很大的不同。在1.0中,UIWebView控件不再使用。相反,您可以为任何UI函数调用Titanium api。这一变化意味着以下几点:

  1. 你的应用UI完全变成原生的。在你的应用程序中没有更多的web UI,因为原生钛api接管了你所有的UI需求。Titanium在“跨平台原生UI”领域的先驱地位值得称赞。它为那些喜欢本地UI的外观和感觉,但不喜欢官方编程语言的程序员提供了另一种选择。

  2. 你将不能在你的应用程序中使用HTML或CSS,因为web视图消失了。(注意:你仍然可以在Titanium中创建web视图。但是在web视图中你可以利用的Titanium特性很少)Titanium Q& a: HTML &CSS呢?< / >

  3. 您将无法使用流行的JS库,例如JQuery,因为它们假定存在一个DOM对象。您将继续使用JavaScript作为编码语言。但这几乎是你作为一个网络程序员使用Titanium 1.0时唯一可以利用的网络技术。

钛视频:钛1.0有什么新功能

现在,Titanium 1.0会把你的JavaScript编译成“原生位”吗?不。Appcelerator最终在这个开发者博客上澄清了这个问题:我们程序员比市场营销部门的人更真实,不是吗?: -)

接下来是PhoneGap。关于PhoneGap没有太多新东西可说。我的看法是,PhoneGap的开发在IBM今年晚些时候加入之前并不活跃。有些人甚至认为IBM为PhoneGap贡献的代码比Nitobi还多。不管这是不是真的,PhoneGap正在积极开发中,这是很好的。

PhoneGap继续以网页技术为基础,即HTML, CSS和JavaScript。PhoneGap似乎不打算像Titanium那样将原生UI功能与JavaScript连接起来。虽然Web UI在性能和原生外观上仍落后于原生UI,但这种差距正在迅速缩小。在web技术中,有两个趋势可以确保移动web UI在性能方面的亮点:

  1. JavaScript引擎从解释器转移到虚拟机。JavaScript是JIT编译成本地代码,以便更快地执行。Safari JS引擎:SquirrelFish Extreme

  2. 网页渲染从依赖CPU转向使用GPU加速。在硬件加速的帮助下,页面转换和3D动画等图形密集型任务变得更加流畅。GPU加速合成在Chrome

这些源自桌面浏览器的改进正在迅速应用于移动浏览器。事实上,自从iOS 3.2和Android 2.0以来,移动网页视图控件的性能和HTML5友好度都大大提高了。JQuery mobile提供UI小工具,PhoneGap提供手机功能,这两者结合在一起,在我看来创造了一个完美的移动网络平台。

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

如果你是一个GWT程序员(像我一样),你可能想看看GWT移动,这是一个用GWT创建移动web应用程序的开源项目。它包括一个PhoneGap GWT包装器,允许在GWT中使用PhoneGap。

Titanium支持native mapkit

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

虽然我们计划进一步增加网页集成和本地ui元素,但我们的重点将倾向于图形密集型应用程序,如游戏开发,而不是基于web的技术。换句话说,我们并不认为人们会完全用Javascript/HTML/CSS来编写Corona应用。

让HTML5的小部件看起来像iphone的小部件是一回事,但让它们表现得同样出色完全是另一回事。html5动画的性能(甚至是简单的视图转换),滚动长列表,对手势的响应感觉很粘和不稳定。iPhone用户会注意到其中的区别。

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

我想我还是会继续使用原生应用。

对于任何对Titanium感兴趣的人,我必须说他们没有一个很好的文档,一些类,属性,方法都缺失了。但很多东西都“记录”在他们的样例应用程序kitensink中,所以它并不是那么糟糕。

我参加了一门关于Android/iPhone开发的课程,我们花了8周时间在Titanium上(游戏邦注:版本是Titanium 1.4.2,时间是2010年11月左右)。以下是我的经验。

iPhone Android双重目标

尽管API指南声称该功能在Android和iPhone上都可用,但事实并非如此。很多东西根本无法在某个平台上运行。有些事情是不同的。

班上很多人都做过iPhone应用程序,如果不进行重大重写,他们无法让这些应用程序在Android上运行。我开发了一款简单的儿童应用Animap(详见瑞典的android market / Appstore),并开始在Windows下开发。一旦Android目标工作,我在OS x上打开项目,它不显示任何iPhone构建的东西,只是Android。你需要在OS x下启动一个双目标项目(好的,我将相关文件复制到一个新项目中)。下一个问题-动画在iPhone上不工作(他们在Android上工作)。滚动事件在iPhone上的工作方式不同。(例如,在Android上,当用户停止滚动并将手指从屏幕上释放出来时,会出现untouch事件,而在iPhone上则不会发生这种情况)。

因为在某些地方没有提到这一点,所以基本上需要先在一个平台上进行试错编程,然后再在另一个平台上进行试错编程。我的意思是,让像Animap这样简单的应用在另一个平台上运行需要大约两天的时间。你还需要有if (android) then…或者(iphone)…在你的代码中…

下载和设置

你必须严格按照说明做。 不要尝试使用java 64位。它将不会编译kitensink 1.4.0演示应用程序。(1.3就可以了!) 您必须将文件直接放在C驱动器上,因为如果路径名太长,那么外部程序将无法接收所有命令行参数。(但适用于小程序) 在1/3的情况下,工具链会停止运行,你必须再次按下“启动”键。那么它可能会起作用……非常不可靠的。 在启动时将找不到模拟器,然后您必须简单地用Ctrl+Alt+Delete杀死adb.exe并重试

网络连接

在wifi网络上,你有时会失去实时连接和钛崩溃在你身上(编译/部署接口) 如果你没有工作的互联网连接,它将无法启动,因为它不能登录到他们的服务器。< / p >

API

与此相比,CSS, HTML和jQuery是一件轻松的事情。Titanium类似于任何其他旧的GUI API,你需要为每个按钮/字段等设置一些属性。得到一个错误的字段只是很容易,记住所有需要设置的属性?你在正确的地方用大写字母拼写了吗?(因为这不会被编译器捕获,但如果你幸运地测试了这部分,将被视为运行时错误)

在Titanium中,当你在控件上添加另一个视图或单击GUI中的其他地方时,事情就会简单地中断。

文档

有几个API页面带有Android符号,但只会在您尝试创建控件时返回null。尽管有这些符号,但它们并不只是在Android平台上可用。有时Android被提到不支持某个特定的方法,但整个API就缺失了。

KitchenSink并

演示应用程序。我是否提到过,如果您将它放在Eclipse项目文件夹中,因为路径太长而无法编译?必须放在C盘的根文件夹里。我目前使用的符号链接(mklink /J…)

无证的方法

你必须合理地使用事物作为标签。setText('Hello World')来更改一个可靠的标签,但这根本没有记录。

调试

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

编辑

这些api没有任何好的格式,所以你不能在Eclipse中通过帮助等方式获得普通的代码补全。Aptana,请帮帮我!

硬件

编译器/工具似乎不是多线程的,所以一个快速的计算机和一个快速的硬盘驱动器是必须的,因为你必须做大量的试验&错误。我提到过糟糕的文件吗?你必须把那里的一切都试一试,因为你不能相信它!

一些积极的事情

  • 开源
  • 在之前的项目中,我向自己保证永远不会再使用闭源,因为你不能仅仅通过投入时间和人力来解决问题。当你在项目的后期,需要在一个严格的截止日期前交付时,这很重要。这是开源的,我已经能够看到为什么工具链断裂,并实际修复它。

  • Bugdatabase

  • 它也是开放的。你可以简单地看到你不是一个人,做一个变通的办法,而不是再花4个小时在试错上。

  • 社区

  • 似乎在他们的论坛上很活跃。

错误

  • Titanium 1.4不是线程安全的。这意味着如果你使用线程(在createWindow调用中使用url:属性)和程序,比如线程正在工作,并发送带有数据的事件来回,你会遇到很多非常非常奇怪的事情-丢失处理程序,丢失窗口,太多事件,太少事件,等等。这完全取决于时间,将代码行以不同的顺序排列可能会导致应用程序崩溃或恢复。在另一个file.js中添加一个窗口会破坏你的app.js执行…这也破坏了Titanium中的内部数据结构,因为它们有时可以并行更新内部数据结构,用其他东西覆盖刚刚更改的值。

我在使用Titanium时遇到的很多问题都来自于我使用实时系统的背景,比如支持数百个线程、事件和消息传递的OSE。这应该在Titanium 1.4中工作,但它并不可靠。

  • Javascript(对我来说是新的)在运行时错误时无声地消亡。这也意味着小而常见的错误,如拼错变量名或读入空指针,在应该崩溃时不会崩溃,因此您可以调试它。相反,您的程序的某些部分只是停止工作,例如一个事件处理程序,因为您放错了位置/键入错误的字符。

  • 然后我们在Titanium中出现了更多简单的bug,比如一些参数在函数中不起作用(这至少在Android平台上很常见)。

  • 试错调试周期速度 在几台电脑上运行titanium Developer后,我注意到瓶颈是硬盘。笔记本电脑上的SSD驱动器使构建周期比4200 rpm驱动器快3-5倍。在台式机上,在RAID 1(条带模式)中使用双驱动器可以使构建速度比使用单个驱动器和稍微快一些的CPU快25%,而且它还优于SSD驱动器笔记本电脑。李< / p > < / >

总结

  • 从这个帖子里的评论来看,似乎有一场像这样的工具可以提供应用程序的平台数量之争。API的数量似乎是关键的卖点。

当你开始使用它的时候,它会非常闪亮。如果你查看打开的bug跟踪器,你会发现bug数量的增长速度一直快于已修复的bug数量。这通常是开发人员不断添加更多功能的标志,而不是专注于减少错误的数量。

作为一个为客户提供多平台应用的顾问,我不确定这是否比在两个平台上开发本地应用更快。这是因为当你达到速度时,你使用钛的速度很快,但突然你向下看,发现自己在一个如此深的洞里,你不知道必须花费多少小时来解决问题。你可以在特定的期限/时间/成本下不承诺特定的功能。

关于我自己:我已经用wxPython使用Python两年了。(GUI是不一致的,但从未像这样中断。可能是我不理解Javascript和Titanium使用的线程模型,但根据他们的开放论坛,我不是一个人,GUI对象突然使用错误的上下文/不更新..??)在此之前,我有移动设备的C和ASM编程背景。

[编辑-添加有错误的部分,不线程安全] [编辑-现在已经工作了一个多月,主要是在PC上,但也有一些在OS X上。增加了iPhone和Android的双重目标。

.

.
我试过corona。它很好,直到我发现它不支持流式mp3音频。 所以,我就停在这里了。我想如果我真的想成为一名iphone应用程序开发人员,我应该学习obj c。我想做一个应用程序,它有一个电台列表,你点击它们,它就开始播放

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

1)如果你希望在多个平台上使用相同的代码,祝你好运!你会看到一些类似backgroundGradient的东西,直到你发现android版本不支持它。然后不得不恢复使用渐变图像,不妨使用它的两个版本,使代码更容易对吗?

2)很多奇怪的行为,在Titanium android sdk上,你需要理解什么是“沉重”的窗口,只是为了让后退按钮工作,甚至更好的定向事件跟踪。这并不是真正的android平台,这只是Titanium试图让他们的API工作的方式。

3)你被扔在黑暗中,事情会崩溃,你必须开始注释代码,然后当你找到它时,永远不要使用它。有一些明显的错误,比如android上的方向和百分比,已经存在了六个多月了。

4) bug ....有很多bug,它们会被报告,等待几个月,几天就能修复。我很惊讶,在android存在这么多其他问题的情况下,他们竟然还计划发布一个黑莓手机sdk。

5) Titanium Iphone和Titanium Android的javascript引擎完全不同。在android版本,你可以下载远程javascript文件,包括和使用库,如mootools, jquery等。当我发现这一点时,我在天堂,因为我不需要继续编译我的android应用程序。android apk安装过程需要很长时间!Iphone都不可能,而且Iphone版本的javascript引擎更快。

如果你远离很多原生UI部分,例如使用setInterval来检测方向变化,坚持使用渐变图像,忘记后退按钮,创建自己的动画,忘记窗口标题,工具栏和仪表板。你真的可以做一个api,在这两个工作,而不需要大量的重写。但在这一点上,它就像一个网络应用程序一样缓慢。

那么这值得吗?痛苦过后,每一分钟都是值得的。你可以抽象逻辑,只是为每个人构建不同的UI,而不是到处都是。钛合金可以让你的应用变得流畅,感觉非常快。你失去了每个平台强大的布局能力,但如果你想得简单,事情可以在单一语言下完成。

为什么不开发网页应用呢?在入门级市场的android手机上,它生成web视图的速度非常慢,并且消耗了大量的内存,你可以用它来做更复杂的逻辑。

下面是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 < / p >

Rhomobile Rhodes (http://rhomobile.com/products/rhodes)在方法上与PhoneGap非常相似,但它是唯一具有以下功能的框架:

  1. 模型视图控制器模式(如 大多数web框架提供)
  2. 对象关系管理器
  3. 支持所有流行的智能手机(包括Windows Phone 7)
  4. 托管的开发服务(不仅仅是托管的构建):http://rhohub.com
  5. RhoStudio IDE中的完整调试器和无sdk模拟器
  6. 支持同步脱机数据