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