我是一名网络开发人员,我想将我的网络产品转移到 iPhone。其中一款产品就像谷歌地图:在手机屏幕上显示地图,您可以拖动或调整地图大小并查看我们添加到地图中的一些信息。
我知道有一些技术可以让你使用 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)编译器之类的东西。这在 PhoneGap 中也是如此。从架构的角度来看,这两个框架非常相似。
现在,它们有什么不同吗?是的。首先,Titanium 似乎比 PhoneGap 功能更丰富,因为它将更多手机功能连接到 javascript。最值得注意的是,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)。
因此,如果您对应用程序的关注是让它看起来更“原生”,Titanium 是一个更好的选择。如果您希望能够更轻松地将您的应用程序“移植”到另一个平台,PhoneGap 会更好。
2010 年 8 月 13 日更新: 链接到 Titanium 员工对米奇问题的回答。
2010 年4 月 12 日更新: 我决定对这篇文章进行年度审查,以使其信息保持最新。许多事情在一年中发生了变化,使得最初帖子中的一些信息已经过时。
最大的变化来自钛。今年早些时候,Appcelerator 发布了 Titanium 1.0,从架构的角度来看,它与之前的版本大相径庭。在 1.0 中,不再使用 UIWebView 控件。相反,您可以为任何 UI 功能调用 Titanium API。这种变化意味着几件事:
您的应用程序 UI 变得完全原生。由于原生 Titanium API 接管了您所有的 UI 需求,因此您的应用程序中不再有 Web UI。Titanium 在“跨平台原生 UI”前沿领域的开拓值得称赞。它为喜欢原生 UI 的外观和感觉但不喜欢官方编程语言的程序员提供了替代方案。
您将无法在应用程序中使用 HTML 或 CSS,因为 Web 视图已消失。(注意:您仍然可以在 Titanium 中创建 Web 视图。但是您可以在 Web 视图中利用的 Titanium 功能很少。)Titanium 问答:HTML 和 CSS 发生了什么?
您将无法使用假设存在 DOM 对象的流行 JS 库,例如 JQuery。您继续使用 JavaScript 作为您的编码语言。但是,如果您以 Web 程序员的身份来到 Titanium 1.0,那么这几乎是您可以使用的唯一 Web 技术。
Titanium 视频:Titanium 1.0 中的新功能。
现在,Titanium 1.0 是否将您的 JavaScript 编译成“原生位”?没有。Appcelerator 终于在这个开发者博客上澄清了这个问题:Titanium Guides 项目:JS 环境。我们程序员比市场部的人更真诚,不是吗?:-)
转到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 动画等图形密集型任务变得更加流畅。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 应用程序的内容生成本地包装器。它会生成一个 WhatYourPlatformIs 项目,您构建并部署它。如果我们谈论的是 iPhone(这是我花时间的地方),它似乎与创建 Web 应用程序启动器(一个拥有自己的 Springboard 图标的快捷方式,所以你可以像(喜欢)一样启动它)本机应用程序)。“应用程序”本身仍然是 html/js/等,并在托管浏览器控件中运行。除此之外,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/etc. 只是在 UIWebView 控件内执行,并且您的 js 调用的 PhoneGap JavaScript API 被路由到本机 API。
Titanium 应用程序成为本机应用程序 - 它们只是使用 Web 开发技术开发的。
这实际上意味着什么?
Titanium 应用程序看起来像一个“真正的”应用程序,因为最终它是一个“真正的”应用程序。
PhoneGap 应用程序看起来像是托管在浏览器控件中的 Web 应用程序,因为最终它是托管在浏览器控件中的 Web 应用程序。
哪个适合您?
如果您想使用 Web 开发技能编写本机应用程序,Titanium 是您的最佳选择。
如果您想使用可以实际部署到多个平台(iPhone、Android、Blackberry 以及他们决定包含的任何其他平台)的 Web 开发技能编写应用程序,并且如果您想访问本地平台功能的子集(GPS、加速度计等)通过统一的 JavaScript API,PhoneGap 可能就是你想要的。
你可能会问:我为什么要写一个PhoneGapp(我决定使用这个名字)而不是一个托管在网络上的网络应用程序?难道我不能仍然以这种方式访问一些本机设备功能,而且还能方便地进行真正的 Web 部署,而不是强迫用户下载我的“本机”应用程序并安装它吗?
答案是:因为您可以将您的 PhoneGapp 提交到 App Store 并为其收费。您还将获得启动器图标,这使用户更难忘记您的应用程序(我更容易忘记书签而不是应用程序图标)。
您当然可以为访问您的网络托管网络应用程序收费,但有多少人真正会通过这个过程来做到这一点?在 App Store 中,我选择一个应用程序,点击“购买”按钮,输入密码,然后我就完成了。它安装。几秒钟后,我正在使用它。如果我不得不使用别人的一次性移动网络交易界面,这可能意味着必须敲出我的姓名、地址、电话号码、抄送号码以及其他我不想敲出的东西,我几乎肯定不会不要经历它。另外,我相信苹果——我相信史蒂夫乔布斯不会记录我的信息,然后向我的 CC 收取一堆顽皮的杂志订阅费。
无论如何,除了涉及网络开发技术这一事实之外,PhoneGap 和 Titanium 是非常不同的 - 以至于只能在表面上进行比较。
顺便说一句,我讨厌网络应用程序,如果你阅读 iTunes App Store 的评论,用户很擅长发现它们。我不会说出任何名字,但我的手机上有几个“应用程序”看起来和运行起来都像垃圾一样,这是因为它们是托管在 UIWebView 实例中的 Web 应用程序。如果我想使用网络应用程序,我会打开 Safari,然后导航到其中一个。我买了一部 iPhone,因为我想要 iPhone-y 的东西。例如,我在 Safari 中使用时髦的谷歌网络应用程序没有问题,但如果谷歌只是通过将网络应用程序呈现为原生应用程序,将书签偷偷带入 Springboard,我会感到受骗。
要离开了。我的女朋友脸上的表情是“请你停止使用那台电脑”三秒钟。
我正在学习 Android/iPhone 开发课程,我们在 Titanium 上花了 8 周时间(不是全日制)(版本是 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 上,当用户停止滚动并从屏幕上松开手指时,您会收到 untouch 事件,这在 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盘根目录下。我目前使用符号链接(mklink /J ...)
您必须适当地使用 label.setText('Hello World') 来更改可靠的标签,但这根本没有记录。
Titanium.API.info('打印输出是调试的唯一方法');
这些 API 没有任何好的格式,因此您无法在 Eclipse 中通过帮助等获得普通的代码完成。阿普塔纳请帮忙!
编译器/工具似乎不是多线程的,因此必须使用具有快速硬盘驱动器的快速计算机,因为您必须进行大量试验和错误。我有没有提到糟糕的文档?您必须尝试那里的所有内容,因为您无法信任它!
从以前的项目中,我向自己承诺永远不会再使用封闭源代码,因为你不能仅仅通过投入时间和人力来解决问题。当您在项目中迟到并且需要在硬期限内交付时,这一点很重要。这是开源的,我已经能够看到工具链中断的原因并实际修复它。
错误数据库
它也是开放的。您可以简单地看到您并不孤单并做一个解决方法,而不是再花 4 个小时在试错上。
社区
我在使用 Titanium 时遇到的许多问题都来自我在 OSE 等支持数百个线程、事件和消息传递的实时系统方面的背景。这应该在 Titanium 1.4 中工作,但它根本不能可靠地做到这一点。
Javascript(对我来说是新的)在运行时错误时默默地死掉。这也意味着小而常见的错误,例如拼写错误的变量名或读取空指针不会在应该崩溃的时候崩溃,因此您可以对其进行调试。相反,您的程序的某些部分会停止工作,例如事件处理程序,因为您放错了/输入了一个字符。
然后我们在 Titanium 中有更简单的错误,比如一些参数在函数中不起作用(至少在 Android 平台上很常见)。
试错调试周期速度 在多台计算机上运行 Titnium Developer 后,我注意到瓶颈是硬盘驱动器。笔记本电脑上的 SSD 驱动器使构建周期比 4200 rpm 驱动器快 3-5 倍。在台式机上,RAID 1(条带模式)下的双驱动器使构建速度比 CPU 速度稍快的单驱动器快 25%,而且它也击败了 SSD 驱动器的笔记本电脑。
当您开始使用它时,这非常重要。如果您查看打开的 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) Bug .... 有很多 Bug,它们会被报告,等待几个月,几天后得到修复。我很惊讶他们甚至计划在 android 存在许多其他问题时发布一个 black berry mobile sdk。
5) Titanium Iphone 与 Titanium Android javascript 引擎完全不同。在 android 版本上,您可以下载远程 javascript 文件,包含和使用 mootools、jquery 等库。当我发现这一点时,我在天堂,因为我不必继续编译我的 android 应用程序。android apk安装过程需要这么长时间!Iphone 这一切都不可能,而且 iphone 版本有一个更快的 javascript 引擎。
如果您远离许多原生 UI 部分,即使用 setInterval 检测方向变化、坚持使用渐变图像、忘记后退按钮、构建自己的动画、忘记窗口标题、工具栏和仪表板。你真的可以制作一个不需要大量重写的API。但在这一点上,它就像一个 webapp 一样迟钝。
那么值得吗?在所有的痛苦之后,每一分钟都是值得的。您可以抽象逻辑并为每个构建不同的 UI,而不是在任何地方都使用 else。Titanium 可让您制作流畅的应用程序,感觉很快。你失去了每个平台强大的布局能力,但如果你想简单,事情可以在单一语言下完成。
为什么不是网络应用程序?在入门级市场上,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
Titanium 支持原生 mapkit
使 HTML5 小部件看起来像 iphone 小部件是一回事,但让它们表现同样出色则完全是另一回事。html5 动画的性能(甚至是普通的视图转换)、滚动长列表、对手势的响应感觉粘滞和生涩。iPhone 用户会注意到差异。
不同设备支持的手势类型也存在一些差异,这也会导致特定于平台的代码和可用性问题。
我想我现在会继续使用本机应用程序。
Rhomobile Rhodes ( http://rhomobile.com/products/rhodes ) 在方法上与 PhoneGap 非常相似,但它是唯一具有以下功能的框架:
对于任何对 Titanium 感兴趣的人,我必须说他们没有很好的文档,缺少一些类、属性、方法。但是在他们的示例应用程序 KitchenSink 中“记录”了很多内容,因此还不错。
我对 PhoneGap 的理解是它们为大部分 iPhone API 提供了 Javascript API。
对于 Web 开发人员背景来说,Titanium 似乎更容易。它是一个简单的 XML 文件来创建一个基本的 TabView 应用程序,然后内容区域中的所有内容都由 HTML / JS 控制。我也知道 Titanium 确实提供了对某些框架的一些 javascript 访问(特别是对位置信息、电话 ID 等的访问)。
更新:Titanium 在其框架的 0.8 版中添加了 Maps API。
你应该学习 Objective c 并编写原生应用程序。不要依赖这些你认为会让生活更轻松的东西。Apple 确保最简单的方法是使用他们的本地工具和语言。对于您的 100 行 javascript,我可以在 3 行代码中执行相同的操作,或者根本不需要代码,具体取决于元素。观看一些教程 - 如果您了解 javascript,那么目标 c 并不难。解决方法很糟糕,苹果可以随时给你拔掉插头。
在您提到的解决方案中,似乎没有一个可以让您直接访问 OS 3.0 中引入的 MapKit 框架。
由于 Google Maps HTML 小部件不如 MapKit(请参阅 Google Latitude 示例),您可能最好开发一个原生 Cocoa 触摸应用程序,或者选择一个可以扩展以添加 MapKit 集成的解决方案。PhoneGap 可以通过这种方式进行扩展(它是开源的,因此默认情况下也是如此),其他一些解决方案可能也是如此。
编辑:Titanium 现在支持 MapKit
我试过电晕。很好,直到我发现它不支持流式 mp3 音频。所以,我就停在了那里。我认为如果我真的想成为一名 iphone 应用程序开发人员,我应该学习 obj c。我只想制作一个包含广播电台列表的应用程序,然后单击它们开始播放。