我是一名网络开发人员,我想将我的网络产品移至iPhone.其中一个产品就像Google地图:在手机屏幕上显示地图,您可以拖动或调整地图大小并查看我们添加到地图中的一些信息.
我知道有一些技术可以让您使用HTML,CSS和Javascript来开发本机iPhone应用程序.我发现了一些:
安斯卡移动
PhoneGap的
Appcelerator的
还有其他同类产品吗?它们之间有什么区别?我该选哪个?
我在stackoverflow上注册只是为了评论最多的投票答案.糟糕的是stackoverflow不允许新成员发表评论.所以我必须让这个评论更像是一个答案.
Rory Blyth的答案包含了关于两个javascript移动框架的一些有效点.但是,他的关键点是不正确的.事实是,Titanium和PhoneGap比不同更相似.它们都通过一组javascript API公开手机功能,应用程序的逻辑(html,css,javascript)在本机WebView控件中运行.
PhoneGap不仅仅是Web应用程序的本机包装器.通过PhoneGap javascript API,"网络应用程序"可以访问手机功能,如地理位置,加速度计相机,联系人,数据库,文件系统等.基本上,手机SDK提供的任何功能都可以"桥接"到javascript世界.另一方面,在移动Web浏览器上运行的普通Web应用程序无法访问大多数这些功能(安全性是主要原因).因此,PhoneGap应用程序更像是一个移动应用程序,而不是一个Web应用程序.您当然可以使用PhoneGap来打包一个完全不使用任何PhoneGap API的Web应用程序,但这不是为PhoneGap创建的.
Titanium不会将你的html,css或javascript代码编译成"native bits".它们作为资源打包到可执行包中,就像嵌入的图像文件一样.当应用程序运行时,这些资源被加载到UIWebView控件并在那里运行(当然是javascript,而不是本机位).没有javascript到本机代码(或to-objective-c)编译器这样的东西.这在PhoneGap中也以相同的方式完成.从架构的角度来看,这两个框架非常相似.
现在,他们有什么不同吗?是.首先,通过将更多手机功能与javascript连接起来,Titanium似乎比PhoneGap功能更丰富.最值得注意的是,PhoneGap不会将许多(如果有的话)本机UI组件暴露给javascript.另一方面,Titanium具有全面的UI API,可以在javascript中调用以创建和控制各种本机UI控件.利用这些UI API,Titanium应用程序看起来比PhoneGap应用程序更"原生".其次,PhoneGap比Titanium支持更多的手机平台.PhoneGap API更通用,可以在不同的平台上使用,如iPhone,Android,Blackberry,Symbian等.Titanium主要针对iPhone和Android至少目前.它的一些API是特定于平台的(如iPhone UI API).使用这些API将降低应用程序的跨平台功能.
因此,如果您对应用程序的关注是使其更具"本机"外观,那么Titanium是更好的选择.如果您希望能够更轻松地将您的应用"移植"到另一个平台,PhoneGap会更好.
2010年8月13日更新: 链接到Titanium员工对Mickey问题的回答.
更新日期:12/04/2010: 我决定对此帖进行年度审核,以保持其最新信息.许多事情在一年内发生了变化,使得最初的帖子中的一些信息过时了.
最大的变化来自Titanium.今年早些时候,Appcelerator发布了Titanium 1.0,从架构的角度来看,它大大偏离了以前的版本.在1.0中,UIWebView控件不再使用.相反,您可以为任何UI功能调用Titanium API.这种变化意味着几件事:
您的应用UI变得完全原生.由于本机Titanium API可以控制您的所有UI需求,因此您的应用中不再有Web UI.通过在"跨平台原生UI"前沿上开拓,Titanium值得称赞.它为程序员提供了更喜欢本机用户界面的外观和感觉,但却不喜欢官方编程语言.
您将无法在应用中使用HTML或CSS,因为Web视图已消失.(注意:您仍然可以在Titanium中创建Web视图.但是,您可以在Web视图中利用很少的Titanium功能.)Titanium问答:HTML和CSS发生了什么?
您将无法使用流行的JS库,例如假定存在DOM对象的JQuery.您继续使用JavaScript作为编码语言.但是,如果您作为Web程序员来到Titanium 1.0,那么这几乎是您可以利用的唯一Web技术.
Titanium视频:Titanium 1.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有任何计划将本机UI功能桥接到JavaScript,正如Titanium正在做的那样.虽然Web UI在性能和原生外观方面仍然落后于原生UI,但这种差距正在迅速缩小.Web技术有两种趋势,可确保移动Web UI在性能方面具有明显的特性:
JavaScript引擎从解释器移动到虚拟机.JavaScript是JIT编译成本机代码以加快执行速度.Safari JS引擎:SquirrelFish Extreme
网页渲染从依赖CPU转向使用GPU加速.借助硬件加速,图形密集型任务(如页面过渡和3D动画)变得更加顺畅.GPU中的GPU加速合成
源自桌面浏览器的此类改进正在快速传递到移动浏览器.事实上,自从iOS 3.2和Android 2.0以来,移动网络视图控件已经变得更加性能和HTML5友好.移动网络的未来是如此充满希望,它吸引了一个大家伙来到城镇:JQuery最近宣布了其移动网络框架.随着JQuery Mobile提供UI小工具和PhoneGap提供手机功能,他们两个组合在我看来创建了一个完美的移动网络平台.
我还应该提到Sencha Touch作为另一个移动Web UI小工具框架.Sencha Touch 1.0版最近在包含GPLv3的双重许可模式下发布.与JQuery Mobile一样,Sencha Touch与PhoneGap配合得很好.
如果您是GWT程序员(像我一样),您可能需要查看GWT Mobile,这是一个用GWT创建移动Web应用程序的开源项目.它包括一个PhoneGap GWT包装器,可以在GWT中使用PhoneGap.
从我收集的内容来看,这两者之间存在一些差异:
PhoneGap基本上为仍然是Web应用程序生成本机包装器.它会吐出一个WhateverYourPlatformIs项目,你可以构建它并进行部署.如果我们谈论iPhone(这是我花费时间的地方),它与创建一个Web应用程序启动器(一个获得自己的Springboard图标的快捷方式)似乎没什么不同,所以你可以像(像)那样启动它本机应用程序)."app"本身仍然是html/js/etc.,并在托管浏览器控件中运行.除此之外,PhoneGap提供的是JavaScript和本机设备API之间的桥梁.因此,您针对PhoneGap API编写JavaScript,然后PhoneGap进行相应的本地调用.在这方面,它是从部署一个普通的旧的Web应用程序不同.
Titanium源被编译为本机位.也就是你的html/js/etc. 不是简单地附加到项目然后托管在Web浏览器控件中 - 它们变成了本机应用程序.这意味着,例如,您的应用程序界面将由本机 UI组件组成.有一些方法可以在没有原生应用程序的情况下获得原生外观,但是......嗯......这通常是一场噩梦.
两者的相似之处在于您使用典型的Web技术(html/js/css/blah blah blah)编写所有内容,并且您可以通过自定义JavaScript API访问本机功能.
但是,再次,PhoneGap应用程序(PhonGapps?我不知道......这是一个愚蠢的名字?它更容易说 - 我知道那么多)作为网络应用程序开始他们的生活,并结束他们作为网络应用程序的生活.在iPhone上,你的html/js /等.只是在UIWebView控件内执行,而您的js调用的PhoneGap JavaScript API被路由到本机API.
Titanium应用程序成为原生应用程序 - 它们只是使用Web开发技术开发的.
这究竟意味着什么?
Titanium应用程序看起来像一个"真正的"应用程序,因为它最终是一个"真正的"应用程序.
PhoneGap应用程序看起来像是一个托管在浏览器控件中的Web应用程序,因为它最终是一个托管在浏览器控件中的Web应用程序.
哪个适合你?
如果您想使用Web开发技能编写本机应用程序,Titanium是您最好的选择.
如果你想使用web开发技能编写一个应用程序,你可以实际部署到多个平台(iPhone,Android,Blackberry,以及他们决定包含的任何其他平台),如果你想访问本机平台功能的一个子集(GPS,加速度计等)通过统一的JavaScript API,PhoneGap可能就是你想要的.
你可能会问:我为什么要写一个PhoneGapp(我决定使用这个名字),而不是一个在网络上托管的网络应用程序?我仍然无法以这种方式访问某些本机设备功能,但也具有真正的Web部署的便利,而不是强迫用户下载我的"本机"应用程序并安装它?
答案是:因为您可以将您的PhoneGapp提交到App Store并为其收费.您还会获得启动器图标,这会让用户更难忘记您的应用程序(我更可能忘记书签而不是应用程序图标).
您当然可以收取访问您的网络托管的网络应用程序的费用,但有多少人真的要经历这个过程呢?通过App Store,我选择一个应用程序,点击"购买"按钮,输入密码,我就完成了.它安装.几秒钟后,我正在使用它.如果我不得不使用其他人的一次性移动网络交易界面,这可能意味着必须点击我的名字,地址,电话号码,CC号码以及其他我不想挖掘的东西,我几乎肯定不会经历它.此外,我相信苹果 - 我相信史蒂夫乔布斯不会记录我的信息,然后收取一堆顽皮的杂志订阅我的CC踢.
无论如何,除了涉及web dev技术这一事实之外,PhoneGap和Titanium是非常不同的 - 只是表面上可比较.
我讨厌网络应用程序,如果您阅读iTunes App Store评论,用户非常擅长发现它们.我不会说出任何名字,但我的手机上有几个"应用程序"看起来像垃圾一样运行,这是因为它们是在UIWebView实例中托管的网络应用程序.如果我想使用网络应用程序,我会打开Safari,你知道,导航到一个.我买了一部iPhone,因为我想要的东西是iPhone-y.我在Safari中使用一个时髦的谷歌网络应用程序没有问题,但是如果谷歌只是通过将一个网络应用程序作为本地应用程序发布到Springboard上,我会感到受骗.
要离开了.我的女朋友可以让你停止使用那台计算机三秒钟的表情.
我正在学习Android/iPhone开发课程,我们花了8周时间使用Titanium(非全职)(版本是Titanium 1.4.2,时间是2010年11月左右).这是我的经历.
尽管API指南声称该功能适用于Android和iPhone,但事实并非如此.很多东西根本不适用于其中一个平台.有些东西的作用不同.
班上很多人已经完成了iPhone应用程序,如果没有重大改写,他们就无法在Android上运行它们.我开发了一个名为Animap的简单儿童应用程序(参见瑞典的android market/Appstore)并开始在Windows下开发.一旦Android目标工作,我在OS X上打开了该项目.它没有显示iPhone的任何构建内容,仅适用于Android.您需要在OS X下启动双目标项目.(好吧,我将相关文件复制到新项目中).下一个问题 - 动画在iPhone上不起作用(它们适用于Android).滚动事件在iPhone上的工作方式不同.(即在Android上,当用户停止滚动并从屏幕释放手指时,您会收到触摸事件,这在iPhone上不会发生).
由于在某处没有提到这一点,您基本上需要在第一个平台上进行试验和错误编程,然后在另一个平台上进行.通过反复试验,我的意思是,在另一个平台上运行这样一个简单的应用程序和Animap需要大约两天的时间.你还需要拥有if(android)then ...或者if(iphone)...遍布你的代码......
你必须按照信中的说明进行操作.不要尝试使用java 64位.它不会编译KitchenSink 1.4.0演示应用程序.(1.3工作正常!)您必须将文件直接放在C驱动器上,因为长的路径名将使外部程序在长时间内不接收所有命令行参数.(虽然很适合小程序)1/3次,工具链会停止,你必须再次按下"启动".然后它可能会工作......非常不可靠.启动时将找不到模拟器,然后您必须使用Ctrl + Alt + Delete删除adb.exe并重试.
在wifi网络上,你有时会失去实时连接和Titanium崩溃(编译/部署界面)如果你没有可用的互联网连接,它将无法启动,因为它无法登录到他们的服务器.
与此相比,CSS,HTML和jQuery是一件轻而易举的事.Titanium类似于任何其他旧的GUI API,您需要为每个按钮/字段/等设置一些属性.让一个字段错误只是为了容易,记住需要设置的所有属性?你在正确的地方用大写字母拼写了吗?(因为这不是编译器捕获的,但如果您很幸运能够测试该部分,则会被视为运行时错误)
在Titanium中,当您在控件顶部添加另一个视图或单击GUI中的其他位置时,事情就会中断.
有几个API页面带有Android符号,但在尝试创建控件时只返回null.尽管有符号,但它们并不仅仅在Android平台上可用.有时提到Android不支持特定方法,但是缺少整个API.
演示应用程序.我是否提到它如果你把它放在Eclipse项目文件夹中就不会编译因为路径太长了?必须放在根文件夹中的C驱动器上.我目前使用symbolik链接(mklink/J ...)
您必须使用label.setText('Hello World')来改变标签的可靠性,但这根本没有记录.
Titanium.API.info('打印输出是唯一的调试方式');
API没有任何良好的格式,因此您无法在Eclipse中通过帮助等获得普通的代码完成.Aptana请帮忙!
似乎编译器/工具不是多线程的,因此必须使用具有快速硬盘的快速计算机,因为您必须进行大量的试验和错误.我提到了糟糕的文件吗?你必须尝试一切,因为你不能相信它!
开源
从以前的项目我承诺自己再也不会使用封闭源,因为你不能简单地通过浪费时间和人力来解决问题.当你在项目中迟到并需要在艰难的截止日期前交付时,这很重要.这是开源的,我已经能够看到为什么工具链会破坏并实际修复它.
Bugdatabase
它也是开放的.你可以简单地看到你并不孤单并做一个解决方法而不是花费4小时在试验和错误上.
社区
似乎在他们的论坛上很活跃.
Titanium 1.4不是线程安全的.这意味着如果你使用线程(在createWindow调用中使用url:property)和线程正在运行的程序并且来回发送带有数据的事件,你会遇到许多非常非常奇怪的东西 - 丢失的处理程序,丢失窗口,太多事件,太少事件等等.这完全取决于时间,以不同顺序放置代码行可能会崩溃或修复您的应用程序.在另一个file.js中添加一个窗口会破坏你的app.js执行...这也会破坏Titanium中的内部数据结构,因为它们有时可以在并行中更新内部数据结构,用其他东西覆盖刚改变的值.
我在Titanium上遇到的大部分问题都来自于我支持数百个线程,事件和消息传递的OSE等实时系统的背景.这应该适用于Titanium 1.4,但它根本不能可靠地完成.
Javascript(对我来说是新手)在运行时错误上无声地死掉.这也意味着小的和常见的错误,如拼写错误的变量名称或读取空指针不会崩溃,因为它应该可以调试它.相反,程序的某些部分会停止工作,例如一个事件处理程序,因为你错误地放置了一个字符/错误输入了一个字符.
然后我们在Titanium中有更多简单的错误,比如一些参数在函数中不起作用(至少在Android平台上很常见).
试用和错误调试周期速度在几台计算机上运行Titnium Developer后,我注意到瓶颈是硬盘驱动器.笔记本电脑上的SSD驱动器使构建周期比4200 rpm驱动器快3-5倍.在桌面上,在RAID 1中使用双驱动器(条带化模式)使得构建速度比单个驱动器上的速度快25%,并且CPU速度稍快,并且它也胜过SSD驱动器笔记本电脑.
从这个帖子中的评论来看,似乎有一个像这样的工具可以提供应用程序的平台数量的争夺.API的数量似乎是关键的卖点.
当你开始使用它时,它会非常闪耀.如果你看一下开放的bugtracker,你会发现bug的数量增长的速度比固定的bug数量还要快.这通常表明开发人员不断添加更多功能,而不是专注于减少错误数量.
作为一名顾问试图为客户提供相当简单的应用程序到多平台 - 我不确定这实际上比在两个平台上进行本机应用程序开发更快.这是因为当你达到速度时,你很快就会使用Titanium,但是当你突然向下看并发现自己陷入如此深的洞时,你不知道必须花多少小时来解决这个问题.您无法承诺在特定截止日期/时间/成本下使用某项功能.
关于我自己:在wxPython中使用Python两年了.(那个GUI是不一致的,但从来没有像这样打破.可能是我没有理解Javascript和Titanium使用的线程模型,但我并不孤单,根据他们的公开讨论论坛,GUI对象突然使用错误的上下文/没有更新.. ???)之前我有移动设备的C和ASM编程背景.
[编辑 - 添加了部分错误而不是线程安全] [编辑 - 现在已经使用它一个月+,主要是在PC上,但有些在OS X上也是如此.增加了iPhone和Android双目标.增加了试用和错误调试周期速度.]
Corona SDK(Ansca Mobile)使用Lua作为编码语言.有关Lua的更多信息,请访问lua.org.
虽然我们计划进一步添加Web集成和本机UI元素,但我们的重点往往是图形密集型应用程序,例如游戏开发,而不是基于Web的技术.换句话说,我们并不认为人们完全用Javascript/HTML/CSS编写Corona应用程序.
我已经和Titanium合作了一个多星期了,感觉我对它的弱点有一个很好的感觉.
1)如果你希望你在多个平台上使用相同的代码祝你好运!你会看到像backgroundGradient这样的东西,直到你发现android版本不支持它为止.然后必须恢复使用渐变图像,不妨将它用于两个版本,以使代码更容易吗?
2)很多奇怪的行为,在Titanium android sdk上你需要了解什么是"重"窗口才能使后退按钮工作,甚至更好的定位事件跟踪.这不是Android平台的真正原因,它只是Titanium试图让他们的API工作的方式.
3)你在黑暗中投掷,事情会崩溃,你必须开始评论代码,然后当你找到它时,永远不要使用它.有一些明显的错误,比如Android上的方向和百分比,已经有六个多月的问题了.
4)臭虫....有很多错误,他们会被报告,坐了几个月,几天后得到修复.我很惊讶他们甚至计划在Android出现这么多其他问题时发布黑莓手机sdk.
5)Titanium Iphone与Titanium Android javascript引擎完全不同.在Android版本上,你可以下载远程javascript文件,包括和使用mootools,jquery等库.当我发现这个时,我在天堂,因为我不必继续编译我的Android应用程序.android apk安装过程需要这么长时间!Iphone都不可能,iphone版本也有更快的javascript引擎.
如果你远离很多本机UI部分,即使用setInterval来检测方向变化,坚持使用渐变图像,忘记后退按钮,构建自己的动画,忘记窗口标题,工具栏和仪表板.你真的可以制作一个适用于不需要大量重写的api.但在那一点上,它就像一个webapp一样缓慢.
值得吗?经过所有的痛苦,它每分钟都值得.您可以抽象逻辑,只为每个构建不同的UI,而不是在任何地方.钛可以让您感觉快速流畅的应用.你失去了每个平台强大的布局能力,但如果你认为简单,就可以用一种语言完成.
为什么不是网络应用程序?在入门级市场上,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支持native mapkit
使HTML5小部件看起来像iphone小部件是一回事,但让它们表现得同样完全是另一回事.html5动画的表现(甚至是简单的视图转换),滚动长列表,对手势的响应感觉粘滞和生涩.iPhone用户会注意到差异.
不同设备支持的手势类型也存在一些差异,这导致平台特定代码和可用性问题.
我猜我现在会继续使用本机应用程序.
Rhomobile Rhodes(http://rhomobile.com/products/rhodes)与PhoneGap的方法非常相似,但它是唯一具有以下内容的框架:
模型视图控制器模式(大多数Web框架提供)
对象关系管理器
支持所有流行的智能手机(包括Windows Phone 7)
托管开发服务(不仅仅是托管版本):http://rhohub.com
RhoStudio IDE中的完整调试器和无SDK模拟器
支持同步脱机数据
对于任何对Titanium感兴趣的人,我必须说他们没有很好的文档,一些类,属性,方法都缺失了.但是他们的示例应用程序中有很多"记录"了KitchenSink,所以它并不坏.
我对PhoneGap的理解是它们为大多数iPhone API提供了Javascript API.
对于Web开发人员来说,Titanium似乎更容易.它是一个简单的XML文件,用于创建基本的TabView应用程序,然后内容区域中的所有内容都由HTML/JS控制.我也知道Titanium确实提供了对某些框架的一些javascript访问(特别是访问位置信息,电话ID等).
更新:Titanium在其框架的0.8版本中添加了Maps API.