用 PHP 和 XML 进行 iPhone 开发

为 iPhone 开发定制的应用程序

Apple iPhone 是市场上最热门的新设备。通过本文学习如何使用现有的 Web 工具为它开发应用程序。

Jack D. Herrington, 高级软件工程师, Leverage Software Inc.

Jack D. Herrington 是一位有着超过 20 年经验的高级软件工程师。他是 Code Generation in ActionPodcasting Hacks PHP Hacks 这三本书的作者。他还发表了 30 多篇文章。可以通过 jherr@pobox.com 与 Jack 联系。



2007 年 9 月 03 日

我为自己感到骄傲:我在购买 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 给出这个文件。

清单 1. commands.xml
<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

清单 2. commands.php
<?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

清单 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 浏览器中导航到这个页面时,会看到与 图 1 相似的页面。

图 1. 粗糙的界面
粗糙的界面

可以使用这个页面作为我的 iPhone 界面,它是有效的。但是,它不太像 iPhone 的界面。所以,下一步是使用 iUI 工具包扩展这个界面。清单 4 给出改进的代码。

清单 4. 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 上的效果完全相同,如 图 2 所示。

图 2. 在 Safari 中显示的 index.php 页面
在 Safari 中显示的 index.php 页面

如果使用 Windows,也不必担心:Safari 现在可以在 Windows 和 Mac 上运行。当然,运行这些代码的 PHP 必须在 Mac 上,才能运行 osascript 命令和 AppleScript 代码。但是,如果希望在 DOS 或 UNIX® 系统上运行,那么可以使用系统命令。

最后一步是创建 do.php 文件,index.php 引用这个文件来运行实际命令。这个文件见 清单 5

清单 5. do.php
<?php
require_once('commands.php');

$cmds = new Commands();
$cmds->runCommand( $_GET['id'] );
?>

现在,可以使用 Safari 在本地浏览这个页面,并单击链接来检查应用程序是否可以正常工作。如果一切正常,iTunes 会根据选择转到下一首或前一首歌曲。

我必须编辑 /etc/httpd/httpd.conf 文件,将 User 设置改为我的用户名,将 Group 设置改为 staff。然后运行以下命令,重新引导 Apache 服务器:

% apachectl graceful

完成之后,在单击链接时,我的 iTunes 界面会在歌曲之间前后转换。然后,只要我的笔记本计算机和 iPhone 在同一个 Wi-Fi 网络中,就可以打开 iPhone 并使用 Safari 浏览器根据 IP 地址访问我的本地机器,然后访问这个应用程序。


Telekenesis

在为本文进行研究时,我发现已经有人将 iPhone Mac 遥控器的概念提升到了一个新高度。这个项目称为 telekinesis,由 Google Code 站点托管该项目。这个应用程序称为 iPhone Remote,它是 Mac OS X 中的一个图形用户界面(GUI)应用程序。

在启动 iPhone Remote 时,它打开 Safari 并访问一个页面,这显示了页面在 iPhone 上的效果(见 图 3)。

图 3. iPhone Remote 界面
iPhone Remote 界面

可以从这里导航到我的应用程序并打开它们,浏览我的文档,使用 iTunes 遥控器,甚至在屏幕上导航并运行命令行 —— 这些操作都可以从 iPhone 完成。

iPhone Remote 提示输入用户名和密码,这样可以防止别人控制您的 Mac。所以,可以把 iPhone 用作远程控制 Mac 的安全的虚拟网络计算(VNC)设备。


结束语

为 iPhone 开发应用程序是非常容易的。广告宣称 iPhone 可以像计算机一样提供互联网访问,这种说法是正确的:可以像在 Mac 或 PC 上一样浏览普通页面。但是,类似 iUI 界面构建程序这样的工具包可以给应用程序提供更接近 iPhone 的外观和感觉 —— 非常适合开发类似由 XML 和 PHP 驱动的 iPhone 遥控器这样的应用程序。

参考资料

学习

  • 您可以参阅本文在 developerWorks 全球网站上的 英文原文
  • iPhone:访问 Apple 的 iPhone 站点,这是了解 iPhone 相关信息的好地方。
  • PHP 主页:访问 PHP 主页,了解关于 PHP 的所有信息。
  • iUI 工具包:访问 Joe Hewitt 的站点,了解关于 iUI 工具包的更多信息。
  • Salling Clicker:了解关于 Salling Clicker 的更多信息,这是创作本文的最初灵感。Salling Clicker 是一款新颖的软件,它让用户能够使用手机控制 Mac 或 PC。
  • iPhone Remote:了解 telekenesis 项目提供的 iPhone Remote,这是一个与本文示例相似但更完整的程序。
  • IBM XML 认证:了解如何成为 IBM 认证的 XML 和相关技术开发人员。
  • XML 技术文档库:在 developerWorks XML 专区 中可以找到大量技术文章、提示、教程、标准和 IBM Redbooks。
  • developerWorks 技术活动和网络广播:通过这些活动了解最新的技术进展。
  • technology bookstore:浏览关于这些主题和其他技术主题的图书。

获得产品和技术

  • IBM 试用软件:使用这些可以从 developerWorks 直接下载的试用软件构建您的下一个开发项目。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Open source, Web development
ArticleID=252946
ArticleTitle=用 PHP 和 XML 进行 iPhone 开发
publish-date=09032007