用 PHP 和 XML 进行 iPhone 开发

2012-02-19 00:00:00 by 【6yang】, 808 visits, 收藏 | 返回

 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 浏览器中导航到这个页面时

可以使用这个页面作为我的 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 上的效果完全相同.

分享到:
share

    图片原图

    loading

    loading