PHP と XML による iPhone 開発

iPhone 用のカスタム・アプリケーションを開発する

Apple の iPhone は市場で最もホットな新製品です。既存の Web ツールを使って iPhone 用のアプリケーションを開発する方法を学びましょう。

Jack Herrington (jherr@pobox.com), Senior Software Engineer, Leverage Software

Jack D. Herringtonは、20 年以上の経験を持つシニア・ソフトウェア・エンジニアです。彼の著書には、『Code Generation in Action』、『Podcasting Hacks』、『PHP Hacks』の 3 冊があります。また、30 を超える記事も執筆しています。



2007年 8月 14日

私は自分自身を非常に誇りに思っています。私は iPhone を手に入れる誘惑に負けるまで 4 日間も我慢できたのです。もちろん、私が元々持っていた携帯電話が「がらくた」だったことが大きな理由です。しかし私にとって魅力だったのは、iPhone に Wi-Fi 機能が組み込まれていたこと、そしてもっと重要な点として、素晴らしいブラウザーを持っていることです。ご存じのように、iPhone 用の SDK (software development kit) は、Web ブラウザーによる標準的な DHTML (Dynamic HTML) です。つまり、おなじみの HTML や CSS (Cascading Style Sheet)、Ajax (Asynchronous JavaScript™ + XML) などのフロントエンド技術を、好みのバックエンド技術 (PHP や Rails、Java™ あるいは何でも) と組み合わせて使えるのです。

iPhone をいじり回し、誰かに電話したり、Google マップで遊んだり、そして iPod 機能を使って音楽を聴いたり、など、誰もが普通にすることをしたら、今度は iPhone 専用の何かを開発する番です。そこで問題は、何を開発するか、です。

iPhone に developerWorks を追加する

developerWorks のフィードを 1 本も見逃さないでください。皆さんの iPhone でトピックやゾーン、ブランドを選択したり、あるいは記事を選んだり宣伝文句を読んだり、あるいはサイトを訪れることができます。フィードの URL は http://www.ibm.com/developerWorks/iphone です。

さて、私の古い携帯電話で便利だったものの 1 つが Salling Clickerアプリケーションです。Salling Clicker は、任意の携帯電話を Macintosh 用のリモート・コントロールに変えるのです (そして今では Microsoft® Windows® を実行するコンピューター用のリモコンに変えることもできます)。携帯電話でこのクリッカー・アプリケーションを使うことによって、Macintosh コンピューターで AppleScripts を起動させ、Apple の iTunes や KeyNote (Microsoft Office PowerPoint® の Apple 版) をコントロールするなど、あらゆる便利なことができます。この機能をスマート・フォンで利用するには、携帯電話にダウンロードした小さなアプリケーションが必要でした。しかし iPhone は特別なアプリケーションのダウンロードを許可しません。これは Web ブラウザーである Apple Safari が iPhone の SDK であるためです。では Safari を使って Mac をコントロールするためにはどうするのでしょう。

私が見つけたソリューションは、Mac OS X マシンで PHP と Joe Hewitt による iUI ツールキットとを組み合わせて使う方法です。このツールキットは Web ページに iPhone 風のインターフェースを作成します。また 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> タグを配列として持つ場合には、commands.php クラスは _commands メンバー変数をタイトルと AppleScript コマンドと共にロードします。

さらに次の 2 つのメソッドが定義されています。

  • getCommands() メソッドは単純に名前のリストを返します。
  • runCommand() メソッドは索引を与えられると、そのコマンドを osascript コマンドライン AppleScript 実行プログラムを使って実行します。

インターフェースを作成する

commands 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() メソッドを使ってコマンドのリストを要求します。次にこのスクリプトは do.php ページへの一連のリンクを、コマンドの索引番号と、Commandsクラスが返すコマンドの名前を使って作成します。

このページまで 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 は、osascript コマンドと AppleScript コードを実行するためには Mac 上になければなりません。しかしこれを DOS あるいは UNIX® システム上で実行したい場合には、システム・コマンドを使うことができます。

最後のステップとして、実際のコマンドを実行するために index.php が参照する do.php ファイルを作成します。このクラスをリスト 5 に示します。

リスト 5. do.php
<?php
require_once('commands.php');

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

これで、Safari を使ってローカルでページをブラウズでき、また単純にリンクをクリックすればアプリケーションが動作するかどうかをチェックすることができます。すべてが適切に動作していれば、iTunes はユーザーの選択に応じて次の曲に進むか、あるいは前の曲に戻るはずです。

私がインストールを変更しなければならなかった点が 1 つあります。それは、/etc/httpd/httpd.conf ファイルを編集し、User 設定を私のユーザー名に変更し、Group 設定を staffに変更する必要があったことです。そして次のコマンド・ラインを実行して Apache サーバーをリブートしました。

% apachectl graceful

これを実行した後は、iTunes インターフェースは私がリンクをクリックするたびに曲と曲の間を行ったり来たりしました。次に iPhone をオンにし、(私のラップトップと iPhone が同じ Wi-Fi ネットワークにある限り) Safari ブラウザーを使って IP アドレスでローカル・マシンに行くことができ、このアプリケーションにアクセスすることができます。


telekenesis プロジェクト

私がこの記事のために調査を行ってみると、Mac を利用した iPhone 用のリモコンというこの概念全体を、誰かが既に新しいレベルにまで高めていることがわかりました。このプロジェクトは telekinesis と呼ばれ、Google Code サイトでホストされています。またそのアプリケーションは iPhone Remote と呼ばれ、Mac OS X の GUI (graphical user interface) アプリケーションとして実行されます。

iPhone Remote を起動すると、Safari が開かれ、このアプリケーションが iPhone でどう表示されるかを示すページが表示されます。これを図 3 に示します。

図 3. iPhone Remote インターフェース
iPhone Remote インターフェース

このインターフェースから、私のアプリケーションまでナビゲートでき、それらを開くことができ、私の文書をブラウズでき、iTunes リモコンを使うことができ、さらには画面の中をあちこちナビゲートし、コマンドラインを実行することさえできます。このすべてを iPhone から行えるのです。

iPhone Remote は、iPhone Remote をインストールして実行すれば誰でも勝手にその Mac を使えてしまうのを防ぐために、ユーザー名とパスワードを要求します。そのため、リモートで Mac を利用するためのセキュアな VNC (virtual network computing) 機器として iPhone を使うこともできます。


まとめ

iPhone 用の開発は簡単です。宣伝文句によれば、iPhone はインターネットにそのままアクセスでき、一部のモバイル版インターネットに限定されることはありません。そして実際にその宣伝通りです。Mac や PC でページをブラウズするのとまったく同じように、通常のページをブラウズすることができます。しかしインターフェース作成用の iUI のようなツールキットによって、アプリケーションのルック・アンド・フィールを、より本物の iPhone に近づけることができます。こうしたツールキットは、ここで紹介した XML と PHP を利用した iPhone リモコンなどのアプリケーションには非常に便利です。

参考文献

学ぶために

  • Apple のiPhoneサイトを見てください。iPhone についての情報を見つけるには最適の場所です。
  • PHP のホームページを訪れ、PHP のすべてを学んでください。
  • Joe Hewitt のサイトを調べ、iUI ツールキットについて詳しく学んでください。
  • この記事を書くきっかけとなった、Salling Clickerについて学んでください。これは携帯電話を使って Mac や PC をコントロールしたい人達にとって、素晴らしいリソースとしての地位を保っています。
  • ここであげた例の完全版、iPhone Remoteについて、telekenesis プロジェクトから学んでください。
  • XML および関連技術において IBM 認証開発者になる方法については、IBM XML certificationを参照してください。
  • developerWorks の XML ゾーンはXML の技術ライブラリーとして、広範な話題を網羅した技術記事やヒント、チュートリアル、技術標準、IBM レッドブックなどを用意しています。
  • developerWorks technical events and webcastsで最新情報を入手してください。
  • technology bookstoreには、この記事や他の技術的な話題に関する本が豊富に取り揃えられています。

製品や技術を入手するために

  • iPhone を持っている方は、developerWorks のフィードを 1 本も見逃さないでください。皆さんの iPhone で次のフィード URL をアクセスすれば、話題やゾーン、ブランドを選択したり記事を選んだり、宣伝文句を読んだり、あるいはサイトを訪れることができます。
    http://www.ibm.com/developerWorks/iphone
  • 皆さんの次期開発プロジェクトをIBM trial softwareで構築してください。developerWorks から直接ダウンロードすることができます。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Open source, Web development
ArticleID=258070
ArticleTitle=PHP と XML による iPhone 開発
publish-date=08142007