我是一名网页开发者,希望将我的网络产品移植到iPhone平台。其中一个产品类似于Google地图:在手机屏幕上显示地图,可以拖动或调整地图,并查看我们添加到地图上的一些信息。
我知道有一些技术可以使用HTML、CSS和Javascript来开发原生的iPhone应用程序。我已经找到了几个:
还有其他类似的产品吗?它们之间有什么区别?我应该选择哪一个?
我是一名网页开发者,希望将我的网络产品移植到iPhone平台。其中一个产品类似于Google地图:在手机屏幕上显示地图,可以拖动或调整地图,并查看我们添加到地图上的一些信息。
我知道有一些技术可以使用HTML、CSS和Javascript来开发原生的iPhone应用程序。我已经找到了几个:
还有其他类似的产品吗?它们之间有什么区别?我应该选择哪一个?
我注册了stackoverflow,只是为了在排名最高的答案上发表评论。不好的是,stackoverflow不允许新成员发表评论。所以我必须让这个评论看起来更像一个答案。
Rory Blyth的回答包含了一些关于两个javascript移动框架的有效观点。然而,他的关键观点是不正确的。事实上,Titanium和PhoneGap更相似而不是不同。它们都通过一组javascript API公开移动电话功能,并且应用程序逻辑(html、css、javascript)在本地WebView控件内运行。
PhoneGap不仅仅是一个web应用程序的本地封装。通过PhoneGap的javascript API,"web应用程序"可以访问移动电话功能,例如地理位置、加速度计相机、联系人、数据库、文件系统等。基本上,移动电话SDK提供的任何功能都可以"桥接"到javascript世界中。另一方面,在移动Web浏览器上运行的普通Web应用程序无法访问大多数这些功能(安全性是主要原因)。因此,PhoneGap应用程序更像是移动应用程序而不是Web应用程序。当然,您确实可以使用PhoneGap来包装一个根本不使用任何PhoneGap API的Web应用程序,但这不是PhoneGap创建的目的。
Titanium不会将您的html、css或javascript代码编译为"本机位"。它们被打包为可执行包的资源,就像嵌入式图像文件一样。当应用程序运行时,这些资源被加载到UIWebView控件中并在那里运行(当然是作为javascript,而不是本机位)。没有所谓的javascript-to-native-code(或to-objective-c)编译器。从架构角度来看,这两个框架非常相似。
因此,如果您关注使应用程序看起来更“本地化”,则Titanium是更好的选择。如果您想更轻松地“移植”应用程序到另一个平台,则PhoneGap将更好。
更新8/13/2010: 链接到Titanium员工回答Mickey的问题。
更新12/04/2010: 我决定对这篇文章进行年度审查,以保持其信息的最新性。一年中发生了许多变化,使得初始文章中的某些信息已过时。
最大的变化来自Titanium。今年早些时候,Appcelerator发布了Titanium 1.0,从架构角度彻底改变了以前的版本。在1.0中,不再使用UIWebView控件。相反,您需要调用Titanium API来进行任何UI功能。这个变化意味着几件事情:Titanium video: What is new in 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。它似乎没有计划像Titanium一样将本机UI功能与JavaScript桥接。虽然Web UI在性能和本机外观方面仍落后于Native UI,但这种差距正在迅速缩小。在Web技术中有两种趋势可以确保移动Web UI在性能方面具有光明的未来:
JavaScript引擎从解释器转向虚拟机。JavaScript被JIT编译成本地代码以加快执行速度。Safari JS引擎:SquirrelFish Extreme
网页渲染从依赖CPU转向使用GPU加速。图形密集型任务如页面过渡和3D动画在硬件加速的帮助下变得更加流畅。Chrome中的GPU加速合成
这些源自桌面浏览器的改进正在迅速传递到移动浏览器。事实上,自iOS 3.2和Android 2.0以来,移动Web视图控件变得更加高效和HTML5友好。移动Web的未来非常有前途,以至于它吸引了一个大牌子: JQuery最近宣布推出其移动Web框架。 JQuery Mobile提供UI小工具,而PhoneGap提供手机功能,两者结合起来在我看来创造了一个完美的移动Web平台。
我还应该提到Sencha Touch作为另一个移动Web UI小工具框架。Sencha Touch版本1.0最近采用双重许可模式发布,其中包括GPLv3。Sencha Touch与PhoneGap一样与JQuery Mobile很配合。
如果您是一名GWT程序员(就像我一样),那么您可能想要查看GWT Mobile,这是一个用于使用GWT创建移动Web应用的开源项目。它包括一个PhoneGap GWT封装器,可在GWT中使用PhoneGap。
PhoneGap生成本质上仍然是Web应用程序的原生包装器。它会生成一个适用于特定平台的项目,您构建并部署它。如果我们正在谈论iPhone(这是我花时间的地方),那么它与创建Web应用程序启动器没有太大区别(一种获得自己Springboard图标的快捷方式,因此您可以像本机应用程序一样启动它)。"应用程序"本身仍然是html / js等,并在托管的浏览器控件内运行。PhoneGap提供的不止这一点,还提供了JavaScript和本机设备API之间的桥梁。因此,您对PhoneGap API进行JavaScript编写,然后PhoneGap执行相应的本机调用。在这方面,它与部署普通的Web应用程序不同。
Titanium源代码被编译为本机二进制文件。也就是说,您的html / js等不仅仅附加到一个项目中,然后在Web浏览器控件内托管 - 它们被转换为本机应用程序。这意味着,例如,您的应用程序界面将由本机UI组件组成。有一些方法可以获得本地外观和感觉而无需使用本机应用程序,但是...嗯...这通常会变成一场噩梦。
两者相似之处在于,您使用典型的Web技术(html / js / css / blah blah blah)编写所有内容,并且通过自定义JavaScript API访问本机功能。
但是,再次强调,PhoneGap应用程序(PhonGapps?我不知道...那是一个愚蠢的名字吗?我知道那很容易说)从Web应用程序开始它们的生活,结束时仍是Web应用程序。在iPhone上,您的html / js等只是在UIWebView控件内执行,而您js调用的PhoneGap JavaScript API则被路由到本机API。
Titanium应用程序成为本机应用程序 - 它们只是使用Web开发技术进行开发。
这实际上意味着什么?
Titanium应用程序看起来像“真正”的应用程序,因为它最终实际上就是一款“真正”的应用程序。
PhoneGap应用程序看起来像在浏览器控件中托管的Web应用程序,因为最终它实际上就是在浏览器控件中托管的Web应用程序。
哪个适合您?
如果您想使用 Web 开发技能编写原生应用程序,则 Titanium 是您的最佳选择。
如果您想使用 Web 开发技能编写可在多个平台(iPhone、Android、Blackberry 和其他任何可能包括的平台)上实际部署的应用程序,并且希望通过统一的 JavaScript API 访问本机平台特性(GPS,加速度计等),则 PhoneGap 可能是您想要的。
您可能会问:为什么我要编写 PhoneGapp(我已决定使用该名称)而不是托管在 Web 上的 Web 应用程序?我不能以这种方式访问一些本机设备功能,但也可以方便地进行真正的 Web 部署,而不是强制用户下载我的“本机”应用程序并安装它吗?
答案是:因为您可以将 PhoneGapp 提交到应用商店并收费。您还会得到启动器图标,这使用户更难忘记您的应用程序(我很可能会忘记书签而不是应用程序图标)。
您当然可以收费访问您托管的 Web 应用程序,但有多少人真正愿意经历这个过程呢?通过 App Store,我选择一个应用程序,点击“购买”按钮,输入密码,然后就完成了。它安装了。几秒钟后,我正在使用它。如果我必须使用其他人的一次性移动 Web 交易界面,这可能意味着不得不敲出我的姓名、地址、电话号码、CC 号码和其他我不想敲出的东西,我几乎肯定不会继续下去。此外,我信任苹果 - 我相信 Steve Jobs 不会记录我的信息,然后以开玩笑的方式向我的 CC 收取一堆淫秽杂志订阅费用。
无论如何,除了涉及Web开发技术之外,PhoneGap和Titanium非常不同,仅在表面上可以进行比较。
顺便说一句,我讨厌Web应用程序,如果你阅读iTunes App Store的评论,用户很容易就能识别它们。我不会点名,但我的手机上有几个“应用程序”看起来像垃圾,并且运行得很差,因为它们是在UIWebView实例中托管的Web应用程序。如果我想使用Web应用程序,我会打开Safari并导航到一个应用。我买iPhone是因为我想要那些很有iPhone特色的东西。我没有问题使用时髦的Google Web应用程序,但如果Google将Web应用程序伪装成本地应用程序并以此在Springboard上出现书签,我会感到被欺骗了。
现在必须走了,我的女朋友看着我,眼神带着“你能不能停止使用电脑三秒钟”的意思。
我正在学习 Android/iPhone 开发课程,我们花了 8 周的时间用 Titanium 进行开发(非全职),版本为 Titanium 1.4.2,时间大约是在2010年11月左右。以下是我的经验。
尽管 API 指南声称这些功能都可用于 Android 和 iPhone,但事实并非如此。许多东西在其中一个平台上根本不起作用,有些功能在不同平台上的工作方式也不同。
班上很多人都做过 iPhone 应用程序,但他们无法将其在 Android 上运行而不进行重大修改。我开发了一个名为 Animap 的简单儿童应用程序(在瑞典的 Android 市场/应用商店中可见),并在 Windows 下开始开发。一旦 Android 目标成功运行,我就在 OS X 上打开了该项目。它没有显示任何 iPhone 的构建内容,只有 Android 的。您需要在 OS X 下启动双重目标项目。 (好吧,我把相关文件复制到了一个新项目中)。下一个问题是:iPhone 上的动画效果不起作用(它们在 Android 上起作用)。滚动事件在 iPhone 上不起作用。 (例如,在 Android 上,当用户停止滚动并释放手指时,您会收到未触摸事件,而在 iPhone 上不会发生这种情况)。
由于这些问题未在任何地方提到,因此您基本上需要在一个平台上进行尝试和错误编程,然后在另一个平台上进行。通过“尝试和错误”,我意味着要将一个简单的应用程序(如 Animap)在另一个平台上运行,需要大约两天时间。您还需要在代码中随处添加 if (android) then... 或 if(iphone)...才能使其正常工作。
您必须严格按照说明进行操作。不要尝试使用64位Java。它无法编译 KitchenSink 1.4.0 示例应用程序。(1.3 可以正常工作!) 您必须直接将文件放在 C 盘上,因为路径过长会使外部程序无法接收所有命令行参数。(对于小型程序来说很好用) 有1/3的可能性,工具链会突然停止工作,您必须再次按“启动”按钮。然后它可能会工作……非常不可靠。 模拟器将在启动时找不到,然后您只需使用 Ctrl+Alt+Delete 杀死 adb.exe,并重试。
在wifi网络上,有时会失去连接,Titanium 将崩溃(编译/部署接口) 如果您没有工作的互联网连接,它将无法启动,因为它无法登录到他们的服务器。
CSS、HTML 和 jQuery 相比之下就像小菜一碟。Titanium 像任何其他旧的 GUI API 一样,您需要为每个单独的按钮/字段等设置一些属性。出错很容易,记得设置所有需要设置的属性吗?您是否在正确的位置使用了大写字母?(因为这不会被编译器捕获,但如果您有幸测试了该部分,则会看到运行时错误)
在Titanium中,如果在控件上添加另一个视图或单击GUI中的其他位置,事情会变得混乱不堪。Corona SDK (Ansca Mobile)使用Lua作为其编码语言。请访问lua.org了解更多关于Lua的信息。
虽然我们计划添加进一步的Web集成和原生UI元素,但我们的重点将倾向于图形密集型应用程序,如游戏开发,而不是基于Web的技术。换句话说,我们并不希望人们完全使用Javascript / HTML / CSS编写Corona应用程式。
我已经使用Titanium工作了一个多星期,对其弱点有了很好的了解。
1) 如果你希望在多个平台上使用相同的代码,那么祝你好运!你可能会看到像backgroundGradient这样的东西,并感到惊讶,但是当你发现安卓版本不支持它时,你就必须退回到使用渐变图像,最好同时适用于两个版本,以使代码更容易处理,对吧?
2) 很多奇怪的行为,在Titanium的Android SDK中,你需要理解什么是“重量级”窗口才能使返回按钮起作用,或者更好的方向事件跟踪。这并不是Android平台的真实情况,这只是Titanium试图让他们的API工作的方式。
3) 你会被扔进黑暗中,事情会崩溃,你必须开始注释代码,然后当你找到问题的根源时,就永远不要再使用它了。有一些明显的bug,比如安卓上的方向和百分比,已经存在了六个月以上的问题。
4) Bug...有很多bug,它们会被报告,坐在那里几个月,然后在几天内修复。我很惊讶他们甚至在有这么多安卓问题的情况下,还计划发布黑莓手机SDK。
5) Titanium iPhone与Titanium Android JavaScript引擎完全不同。在Android版本中,您可以下载远程JavaScript文件,包括并使用库,如mootools、jQuery等。当我发现这一点时,我感到非常高兴,因为我不必不停地编译我的Android应用程序。安卓apk安装过程太长了!在iPhone上,这些都不可能实现,而且iPhone版本具有更快的JavaScript引擎。
如果你避开很多本机UI部件,比如改用setInterval来检测方向变化,使用渐变图像,忘记返回按钮,构建自己的动画,忘记窗口标题、工具栏和仪表板,那么你真的可以构建一个适用于两个平台的API,而不需要进行大量的重写。但是此时它就像一个网页应用程序一样缓慢。
这样做是否值得呢?经历了所有的痛苦,每一分钟都是值得的。你可以抽象出逻辑,只需为每个应用构建不同的用户界面,而无需在此处使用if else语句。Titanium使您能够创建流畅的应用程序,感觉非常快速。您会失去每个平台强大的布局功能,但如果您考虑简单,事情可以在单一语言下完成。
为什么不选择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。
Rhomobile Rhodes(http://rhomobile.com/products/rhodes)与PhoneGap在方法上非常相似,但它是唯一具有以下特点的框架:
对于对Titanium感兴趣的任何人,我必须说他们没有很好的文档记录有些类、属性和方法是缺失的。但是在他们的示例应用程序KitchenSink中有很多“文档”,因此情况并不是那么糟糕。