レベル: 中級 Jack Herrington (jherr@pobox.com), Senior Software Engineer, Leverage Software
2007年 8月 14日 Apple の iPhone は市場で最もホットな新製品です。既存の Web ツールを使って iPhone 用のアプリケーションを開発する方法を学びましょう。
私は自分自身を非常に誇りに思っています。私は 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 専用の何かを開発する番です。そこで問題は、何を開発するか、です。
さて、私の古い携帯電話で便利だったものの 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 ページ
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 サーバーをリブートしました。
これを実行した後は、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 インターフェース
このインターフェースから、私のアプリケーションまでナビゲートでき、それらを開くことができ、私の文書をブラウズでき、iTunes リモコンを使うことができ、さらには画面の中をあちこちナビゲートし、コマンドラインを実行することさえできます。このすべてを
iPhone から行えるのです。
iPhone Remote は、iPhone Remote をインストールして実行すれば誰でも勝手にその Mac を使えてしまうのを防ぐために、ユーザー名とパスワードを要求します。そのため、リモートで
Mac を利用するためのセキュアな VNC (virtual network computing) 機器として iPhone を使うこともできます。
まとめ
iPhone 用の開発は簡単です。宣伝文句によれば、iPhone はインターネットにそのままアクセスでき、一部のモバイル版インターネットに限定されることはありません。そして実際にその宣伝通りです。Mac
や PC でページをブラウズするのとまったく同じように、通常のページをブラウズすることができます。しかしインターフェース作成用の iUI のようなツールキットによって、アプリケーションのルック・アンド・フィールを、より本物の
iPhone に近づけることができます。こうしたツールキットは、ここで紹介した XML と PHP を利用した iPhone リモコンなどのアプリケーションには非常に便利です。
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | |  | Jack D. Herringtonは、20 年以上の経験を持つシニア・ソフトウェア・エンジニアです。彼の著書には、『Code
Generation in Action』、『Podcasting Hacks』、『PHP Hacks』の 3 冊があります。また、30
を超える記事も執筆しています。 |
記事の評価
|