Apple iPhone 是市场上最热门的新设备。通过本文学习如何使用现有的 Web 工具为它开发应用程序。
我为自己感到骄傲:我在购买 iPhone 之前,抵制它的诱惑长达四天。当然,我原来的手机已经非常旧了,这也是买 iPhone 的原因之一。但是 iPhone 确实很酷,尤其是它内置 Wi-Fi,更重要的是,它有一个出色的浏览器。iPhone 的软件开发包(SDK)是标准的 Dynamic HTML(DHTML),通过 Web 浏览器使用。所以,可以使用所有熟悉的 HTML、Cascading Style Sheet(CSS)和 Asynchronous JavaScript™ + XML(Ajax)等前端技术,还可以结合使用多种后端技术:PHP、Rails、Java™ 技术等等。
我玩了 iPhone 一阵子,使用了所有日常操作,比如电话功能,Google Maps,用 iPod 功能听音乐,现在就该为手机开发一些特别的东西了。问题是,要开发什么呢。
我的旧手机缺少的一项功能是 Salling Clicker 应用程序。Salling Clicker 将任何手机转换为遥控器,可以控制 Macintosh 和运行 Microsoft® Windows® 的计算机。通过使用手机上的 clicker 应用程序,可以在我的 Macintosh 计算机上启动 AppleScripts,执行各种有意义的操作,比如控制 Apple iTunes 或 KeyNote(Apple 机器上与 Microsoft Office PowerPoint® 相似的程序)。在智能手机上,这个功能需要将一个小应用程序下载到手机上。但是,iPhone 不允许下载特殊的应用程序,因为 Apple Safari(Web 浏览器)是 SDK。那么,怎么使用 Safari 控制我 Mac 呢?
我发现的解决方案是在 Mac OS X 机器上使用 PHP,并结合使用 Joe Hewitt 的 iUI 工具包。这个工具包在 Web 页面中构建 iPhone 风格的界面。它还处理界面的体验。例如,如果浏览一个条目列表,那么 iUI 会从一边扫到另一边,就像 iPhone 对联系人列表的处理方式一样。
在构建这个应用程序时,首先定义一些命令,这些是 iPhone 遥控器显示的选项。使用一个 XML 文件定义这些命令。清单 1 给出这个文件。
<commands> <command title="Next Song"> tell application "iTunes" to next track </command> <command title="Previous Song"> tell application "iTunes" to back track </command> </commands> |
这个文件包含一系列 <command>
标记。每个标记有一个 title 属性,这个属性为命令定义一个可读的标题。<command>
标记的内容是请求这个命令时执行的 AppleScript 代码。因为采用 XML 编码,所以如果 AppleScript 代码中有尖括号(< 或 >)或者与字符(&),那么必须将它们分别编码为 <
、>
和 &
。
为了包装这个 XML 文件,我编写了一个 PHP V5 Command
类,它读取这个文件、返回命令名并使用 Mac OS X osascript
命令运行这些命令。这个类的代码见 清单 2。
<?php class Commands { private $_commands; function __construct() { $this->_commands = array(); $doc = new DOMDocument(); $doc->load('commands.xml'); $cmds = $doc->getElementsByTagName( 'command' ); foreach( $cmds as $cmd ) { $this->_commands []= array( 'title' => $cmd->getAttribute('title'), 'command' => $cmd->firstChild->nodeValue ); } } function getCommands() { $cmds = array(); foreach( $this->_commands as $cmd ) { $cmds []= $cmd['title']; } return $cmds; } function runCommand( $id ) { $ph = popen( "osascript", "w" ); fwrite( $ph, $this->_commands[$id]['command'] ); fclose( $ph ); } } ?> |
这个类首先装载 commands.xml 文件。它使用 DomDocument
PHP 类读取这个文件。然后,它使用getElementsByTagName
寻找所有命令参数。在获得 <command>
标记数组时,这个类将标题和 AppleScript 命令装载到 _commands
成员变量中。
还定义了两个方法:
getCommands()
方法,它返回名称的列表。runCommand()
方法(获得索引),它使用 osascript
命令行 AppleScript 执行器运行命令。编写了命令 XML 文件和 Commands
PHP 类之后,就该编写界面了。为了简化,我只建立一个相当粗糙的界面。这个界面见 清单 3。
<html><body> <?php require_once('commands.php'); $cmds = new Commands(); ?> <?php $id = 0; foreach( $cmds->getCommands() as $cmd ) { ?> <a href="do.php?id=<?php echo($id);?>"><?php echo( $cmd ); ?></a><br/> <?php $id++; } ?> </body></html> |
这个脚本首先获得 Command
类,然后通过使用 getCommands()
方法要求它提供命令列表。然后,这个脚本使用 Commands
类返回的命令索引号和命令名,建立一组到 do.php 页面的链接。
在 Safari 浏览器中导航到这个页面时
可以使用这个页面作为我的 iPhone 界面,它是有效的。但是,它不太像 iPhone 的界面。所以,下一步是使用 iUI 工具包扩展这个界面.
index.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head> <title>Mac Controller</title> <meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/> <style type="text/css" media="screen">@import "iui/iui.css";</style> <script type="application/x-javascript" src="iui/iui.js"></script> </head> <body> <div class="toolbar"> <h1 id="pageTitle"></h1> <a id="backButton" class="button" href="#"></a> </div> <?php require_once('commands.php'); $cmds = new Commands(); ?> <ul title="Commands" selected="true"> <?php $id = 0; foreach( $cmds->getCommands() as $cmd ) { ?> <li> <a href="do.php?id=<?php echo($id);?>"><?php echo( $cmd ); ?></a> </li> <?php $id++; } ?> </ul> </body></html> |
在这个文件的顶部,包含一个 iUI CSS 文件,其中的样式让页面具有 iPhone 外观。然后,包含 iUI JavaScript 文件,其中的代码处理所有交互操作。在此之后,使用 Commands
类获取命令列表。使用这个命令列表构建一个无序列表(<ul>
),其中每个条目是一个列表条目元素(<li>
)。界面已经不那么难看了。实际上,可以在 Safari 中查看它,其效果与 iPhone 上的效果完全相同.
loading