使用开源 Titanium 构建丰富的跨平台桌面应用程序
Titanium 是一个开源平台,使开发人员能够使用标准的 Web 技术构建丰富的桌面应用程序。Titanium 应用程序可以在 Linux、Mac OS X 和 Windows 操作系统上原生运行。从宏观层面来看,Titanium 直接与 Adobe AIR 竞争,尽管它在三个主要方面与 AIR 不同。首先,Titanium 是开源的;它在 Apache 公共许可证(版本 2)下获得许可。其次,Titanium 是完全可扩展的;Titanium 扩展可以使用多种流行的语言编写,包括 C++、JavaScript、Ruby 和 Python。最后,Titanium 将用户界面编程开放给 Ruby 和 Python 等流行语言——这项工作通常只为 JavaScript 保留。Ruby 和 Python 都完全可以访问文档对象模型 (DOM),这使得这些语言在构建丰富、动态的用户界面方面与 JavaScript 相提并论。
重要的是要注意,Titanium 不是一个提供点击式功能来构建可在 Web 和桌面端运行的单个系统的平台;然而,这并不是说 Web 界面和桌面界面之间的代码共享是不可能的。
一些开发人员可能会选择使用共享和隔离模式进行开发:编写一组通用的共享库,然后编写特定于平台的代码用于 Web 界面,以及其他代码用于桌面界面。在这种情况下,您仍然会有一个单一的代码库,但最终会得到两个不同的应用程序。
其他开发人员可能会选择使用渐进增强进行开发。使用渐进增强,您首先实现一组基本功能,然后随着新资源的可用,您构建功能以利用这些新资源。
Google Docs 是一个很好的例子。您可以在线访问一组基本功能,但如果您安装 Google Gears,您还可以获得离线访问和其他功能。Titanium 应用程序也是如此。开发人员可以通过添加仅在应用程序在 Titanium 实例上运行时才可用的特性和功能来逐步增强其 Web 应用程序。使用这种方法,您只有一个应用程序。
在开发应用程序时,这两种技术都是有效的选择。这两种技术都有优点和缺点,作为开发人员,您需要选择使用哪种方法。
无论您选择哪种技术——两个单独的代码库、一个代码库和两个应用程序,或一个应用程序——至少,Titanium 允许您利用您的 Web 开发知识来构建桌面应用程序。它允许您使用 HTML 和 JavaScript,以及其他最常与 Web 开发相关的语言来开发桌面应用程序。
Titanium 是一个开发平台,其目标明确:利用 Web 技术创建丰富的跨平台桌面应用程序。使用 Titanium,您可以使用 HTML 和 JavaScript 创建桌面应用程序,但仍然可以获得浏览器应用程序无法实现的功能。例如,为桌面构建的 Titanium Web 应用程序可以访问文件系统并与底层操作系统交互。
Titanium 背后的理念并不新鲜,但 Titanium 通过为您提供独特的东西来清晰地将自己区分开来:开源选择带来的无限可能性。您不必被迫使用任何专有技术——您可以使用任何您想要的库或框架。所有技术决策都由您自己决定。
虽然我主要使用 JavaScript 进行 Web 应用程序编程,但它并不是驱动 Web 的唯一技术。Titanium 可以很好地与 Python、PHP、Ruby、Java、Flash 和 Flex 以及 Silverlight 配合使用。因此,无论您现在使用哪种技术来开发 Web 应用程序,您都可能能够将其与 Titanium 一起使用。
由于 Titanium 是在开源 Apache 公共许可证 v2 下发布的,您可以下载源代码、试用、fork 并扩展它。正是这种可扩展性使 Titanium 成为一个开发人员未来可以共同成长的平台。随着新需求的出现,该平台可以变形和演变成不同的形式。
Titanium 正在快速发展,并在过去几个月中对其架构进行了多次重大更改。
Titanium 的初始预览版 (PR1) 整合了 WebKit 和修改版的 Google Gears。本质上,Titanium PR1 使用 WebKit 作为其主要组件,并通过原生扩展系统将其他功能暴露给运行时,这使开发人员可以访问修改版 Gears 中的功能。
在此初始预览版发布后不久,Titanium 团队开始重新构建平台架构。Google Gears 被移除,取而代之的是创建了一个用于公开新功能的新系统:Kroll。
Kroll 是驱动 Titanium 并扩展框架的微内核。这个用 C++ 编写的紧凑型微内核是一个跨语言、跨平台的“绑定”和调用框架,可以在内核中混合和匹配代码。Titanium 公开的所有功能都是通过 Kroll 模块实现的。通过使用 Kroll,Titanium 获得了支持多种语言和技术的能力。而且,由于 Kroll 是完全可扩展的,任何人都可以使用任何技术向平台添加更多功能。您不需要成为 C++ 大师即可扩展 Titanium。您可以使用 Python 和 Ruby,甚至只是普通的 JavaScript 来创建新模块。
在从 PR1 重写的过程中,Titanium 保留了 WebKit 的使用,这是有充分理由的。WebKit 不仅是当今可用的最佳、符合标准的引擎之一,而且还具有许多优点,例如 HTML5 客户端数据库存储、CSS 转换和动画以及快速的 JavaScript 引擎。当然,所有这些都可以在 Titanium 上使用。
理论讲得够多了——现在是时候戴上手套开始使用 Titanium 了。首先,从 titaniumapp.com/download 下载最新版本的 Titanium,并执行安装包
$ chmod +x Titanium-PR3-SDK.bin $ ./Titanium-PR3-SDK.bin
您将看到一个包含许可协议的窗口;单击“我接受”继续。等待安装程序完成,接下来在屏幕上弹出的工具是您在为 Titanium 开发应用程序时最常用的第二个工具(除了您最喜欢的文本编辑器):Titanium Developer。
Titanium Developer 是您开发 Titanium 应用程序所需的主要工具。它具有多个选项卡,用于不同的目的,从打包您的应用程序、管理项目到发现其他开发人员的酷炫内容(图 1)。
第一个选项卡是“项目”,它可以帮助您管理 Titanium 项目。在这里,您可以创建新项目、运行它们进行测试以及打包它们以进行分发(图 2)。
Sandbox 是一个非常有用的工具,用于在无需创建新项目的情况下测试代码。要查看它的实际效果,请尝试在 Sandbox 选项卡上的文本区域中键入以下代码片段,然后按“启动”(图 3)
<div id="output"> </div> <script> document.getElementById('output').innerHTML = "Hello World from Titanium"; </script>
恭喜!您刚刚通过 Sandbox 启动了您的第一个 Titanium 应用程序。Titanium Developer 获取代码片段并使用该代码启动 Titanium 应用程序。在代码片段的文本区域一侧,有用于流行的 JavaScript 框架的按钮。您可以单击其中一个按钮将它们添加到您的沙箱应用程序进行测试,而无需自己包含它们。
下一个选项卡“应用程序”是一个用于发现其他出色的 Titanium 应用程序的工具。Titanium 使您能够通过分发和打包云轻松分发您的应用程序。每个打包为公开的应用程序都将在“应用程序”选项卡中展示,从而使您可以更轻松地与用户共享和分发应用程序(图 4)。
到目前为止,Titanium Developer 可能看起来像任何其他开发工具。您可以使用它来创建新项目、测试它们并打包它们以进行分发——正常的开发工作。但它不仅限于此。Titanium Developer 不仅仅是一个开发工具,它还是一个社交开发工具。社交开发利用社交媒体的力量,与全球开发人员社区进行互动、学习和协作。这就是为什么 Titanium Developer 包含另外两个选项卡:“社区”和“提要”。
“社区”选项卡包含一个完整的 IRC 客户端,该客户端连接到官方 Titanium IRC 频道,使您可以与其他开发人员交谈、获得棘手代码的帮助,甚至分享技巧和窍门。“提要”选项卡具有来自 Twitter 和 FriendFeed 关于 Titanium 的实时 Web 提要,因此您将及时了解平台上发生的一切。您用于创建、打包和部署项目的同一工具也是将您与使用与您相同平台的全球开发人员社区联系起来的工具(图 5)。
而且,关于 Titanium Developer 最好的事情是什么?它实际上是使用 Titanium 构建的。
使用 Titanium Developer 创建新项目很容易。“项目”选项卡将逐步引导您创建新项目。第一步询问您要向项目中添加哪些 JavaScript 库。您可以通过单击其徽标来添加库,也可以通过不单击任何徽标来选择退出。对于此示例,请尝试添加 MooTools。
接下来,您需要输入有关项目的信息。在“项目名称”、“项目描述”、“发布者名称”和“发布者 URL”字段中键入任何您想要的内容。对于“项目位置”,单击文本字段侧面的小文件夹图标,然后在系统上选择将放置项目的目录。最后,您需要一个项目图标,因此单击“应用程序图像”字段侧面的小文件夹图标,然后浏览图像文件。单击“创建项目”。
“项目”选项卡现在在列表中显示您的项目,并在右侧的窗口中显示一些项目信息。此窗口有三个选项卡:第一个选项卡显示您的项目信息,第二个选项卡显示指向您的应用程序包的链接,第三个选项卡显示您的应用程序的分发和下载统计信息(图 6)。
在列表中选择项目,然后单击小的方框图标。这将带您进入 Packager,您可以在其中运行、打包或安装您的应用程序。单击“打包和启动”按钮以启动您新创建的项目。
您现在有了您的第一个项目,但此时它实际上并没有做太多事情。因此,打开您的文件管理器并导航到您在创建项目时为“项目位置”选择的目录。
在您的项目目录中,您将看到多个文件和目录(图 7)
dist:Titanium Developer 在其中存储您打包的应用程序的目录,以便您可以启动它进行测试。
manifest:Titanium 用于确定应用程序打包设置的文件,例如您的应用程序信息以及您在应用程序中使用的模块的设置和版本。
tiapp.xml:应用程序的描述符文件。Titanium 使用它来确定运行应用程序之前的设置,例如初始窗口的设置、版本信息和版权信息。
Resources 目录:存储所有应用程序文件的位置——您的 HTML 页面、样式表和脚本都应保存在此处。
在 Resources 目录的结构方面,Titanium 非常宽松。您可以创建子目录以按照您想要的任何方式构建您的项目,具体取决于您的风格。
现在,使用您最喜欢的编辑器打开 Resources 目录中的 index.html 文件。它应该看起来像这样
<html> <head> <style>body{background-color:#292929;color:white}</style> <script type="text/javascript" src="mootools-1.2.1.js"></script> </head> <body> Welcome to Titanium </body> </html>
如您所见,这只是一个简单的 HTML 页面,Titanium Developer 已经包含了一个指向 MooTools 脚本的链接(该脚本也包含在 Resources 目录中)。现在,编辑文件,使其看起来像列表 1。
列表 1. JavaScript、Python 和 Ruby,全部在一个 HTML 文件中
<html> <head> <script type="text/javascript"> function helloJS() { window.document.getElementById('output').innerHTML = "Hello from Titanium using Javascript"; } </script> <script type="text/python"> def helloPython(): window.document.getElementById('output').innerHTML \ = "Hello from Titanium using Python" window.helloPython = helloPython </script> <script type="text/ruby"> def helloRuby window.document.getElementById('output').innerHTML \ = "Hello from Titanium using Ruby" end window.helloRuby = helloRuby </script> </head> <body> <div id="output"> </div> <div> <button onclick="helloJS()">helloJS</button> <button onclick="helloPython()">helloPython</button> <button onclick="helloRuby()">helloRuby</button> </div> </body> </html>
保存文件,然后转到 Titanium Developer 的“项目”选项卡,然后单击项目上的打包图标。单击“打包和启动”,然后测试您的应用程序。单击按钮以从三种不同的语言获取 hello world——全部在一个页面中(图 8)。
在您编写代码时,您肯定会遇到错误。幸运的是,Titanium 包括 WebKit 的 Web Inspector,您可以使用它进行各种开发任务。要打开 Web Inspector,只需右键单击您的应用程序,然后选择“检查元素”。
完成编写代码并完善您的应用程序后,您现在可以打包您的应用程序了,这使用 Titanium Developer 很容易完成。在 Packager 窗口中,单击“打包以进行分发”按钮。
您将获得几个选项。第一个是选择要为哪些平台打包您的应用程序——您可以从 OS X、Windows 和 Linux(或全部三个)中选择。接下来,您需要决定是将运行时与您的应用程序捆绑在一起,还是在启动期间通过网络安装它。然后,您决定要将哪些模块添加到您的项目中以及是否将它们与您的应用程序捆绑在一起(图 9)。
最后,您可以选择公开您的项目。通过选中“使应用程序公开”,您的应用程序将被添加到应用程序目录中,并向所有用户开放。这极大地帮助了您分发应用程序,因为 Titanium 还会为您托管您的文件。完成后,单击“打包”。
然后,Titanium Developer 将您的项目文件上传到 Packager Cloud 以进行打包。完成后,您将看到指向您指定的每个平台的下载链接。如果您公开了您的应用程序,Titanium Developer 还会开始显示您的应用程序的统计信息,例如每个平台的下载次数和您的应用程序的用户评分(图 10)。
正如您在上面的代码中看到的,Titanium 支持的所有语言都有一个 window 对象。这是共享的全局对象,用于绑定需要在所有语言上都可用的方法和对象。Titanium API 的主命名空间也绑定到此全局对象,可以通过 window.Titanium 访问。
除了 WebKit 的优点(例如客户端数据库存储和 CSS 动画)之外,Titanium 当前的 API 还包含许多桌面应用程序开发所需的必要功能
Titanium.Desktop:用于启动第三方应用程序并在默认浏览器上打开 URL。
Titanium.Filesystem:用于处理文件系统,例如读取和写入文件、创建和管理目录等。
Titanium.Media:用于处理媒体文件,例如音频和视频。
Titanium.Network:用于处理与网络相关的任务,例如套接字连接和 IRC 客户端。
Titanium.Notification:用于自定义系统通知,以及挂钩到平台相关的通知系统,如 Growl 和 Snarl。
Titanium.Platform:用于获取有关用户系统的信息。
Titanium.Process:用于处理系统进程,以及启动和执行系统命令。
Titanium.UI:用于处理原生窗口、菜单和系统框架。
遗憾的是,详细介绍所有这些 API 本身就需要一篇文章(或两篇)。幸运的是,Titanium 官方网站提供了包含更多详细信息的文档。
Mark Obcena 是一位来自菲律宾马尼拉的职业代码运动选手。除了是 Appcelerator Titanium 的核心贡献者和平台布道者之外,他还为多个与 Web 开发相关的开源项目做出了贡献。当他不练习他获得专利的反手 JS-Closure 攻击时,他会在他的网站 Keetology (keetology.com) 上撰写有关设计、开发和所有有趣事物的内容。