用 PHP 和 XML 进行 iPhone 开发

闫辉 2008-03-11 09:08:57
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 给出这个文件。


清单 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 页面


如果使用 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 界面


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

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






回页首




结束语

分享这篇文章……


将这篇文章提交到 Digg

发布到 del.icio.us

提交到 Slashdot!




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

...全文
321 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
csd_design999 2009-06-17
各位大虾,在下想做个简单的IPHONE小程序,在IPHONE桌面做个可以链接网站的图标.


谁可以帮忙做?有报酬哦~~!
  • 打赏
  • 举报
回复
hamzsy 2009-05-15
我觉得这是一个歪打正着的办法,还是搞个正统的方法实现遥控比较好。比如自己开发IPHONE程序来控制自己写的OSX程序
  • 打赏
  • 举报
回复
wuxyun 2009-05-11
顶!。。。
  • 打赏
  • 举报
回复
JackZeng_sys 2008-03-15
高手顶之
  • 打赏
  • 举报
回复
tfp 2008-03-13
不错,
帮我写个小应用 ?


把iPhone里的音乐列出来,选择其中一个,可以播放,

是不是很简单的?





  • 打赏
  • 举报
回复
发帖
iOS
加入

2.8w+

社区成员

主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
申请成为版主
帖子事件
创建了帖子
2008-03-11 09:08
社区公告
暂无公告