понедельник, 13 апреля 2009 г.

Разработка для iPhone на PHP и XML

Продолжая тему предыдущего поста (что-то меня начало понемногу заносить на эппловскую продукцию), решил выложить текст, интересный людям увлекающимся программированием. Во всяком случае, мой друг, в последнее время увлеченно эксплуатирующий McBook от Apple, предложил мне ознакомится с данной статьей. Я глянул, и решил поделиться с вами.


Разработка для iPhone на PHP и XML


developerWorks Россия > XML | Open source >

Разработка для iPhone на PHP и XML

Разработка собственных приложений для iPhone


Уровень сложности: средний

Джек Д Херрингтон, главный инженер-программист, Leverage Software Inc.

13.02.2008

iPhone от Apple – сегодня пожалуй самое модное устройство на рынке. Узнайте, как создавать для него собственные приложения, используя Web-инструменты, которыми вы уже владеете.

Я чрезвычайно горд собой: я продержался целых четыре дня, прежде чем купить iPhone. Конечно, меня во многом побудил к покупке тот факт, что мой предыдущий телефон был изрядным хламом. Но что меня действительно подкупило, так это наличие в iPhone встроенного Wi-Fi-блока и — что ещё важнее — отличного браузера. Дело в том, что набор средств разработки ПО (SDK) для iPhone – это стандартный динамический HTML (DHTML), исполняемый в Web-браузере. Так что можно использовать такие привычные клиентские технологии, как HTML, каскадные таблицы стилей (CSS) и асинхронный JavaScript™ + XML (Ajax) в комбинации с любой серверной технологией, какой только пожелаете: PHP, Rails, Java™.

После того как я немного поиграл с моим новым iPhone’ом и проделал пару стандартных вещей: позвонил нескольким людям, побаловался с Google Maps и послушал мелодии с помощью функциональности iPod, я понял: пора разработать что-нибудь специально для моего телефона. Итак, возник вопрос, что именно разработать?


Что ж, одной вещью, которой я лишился, отказавшись от старого телефона, была программа Salling Clicker. Salling Clicker превращал любой телефон в пульт дистанционного управления (ПДУ) для Macintosh (а сегодня он с тем же успехом работает и с Microsoft® Windows®). Используя это приложение, можно запускать на компьютере с ОС Macintosh скрипты AppleScript, осуществляя всевозможные полезные штуки, такие как управление Apple iTunes или KeyNote (Apple-альтернатива Microsoft Office PowerPoint®). На смартфонах это требовало загрузки на телефон небольшого приложения. Но iPhone не позволяет закачивать специальные приложения, потому что в роли SDK выступает Web-браузер Apple Safari. Итак, как же можно использовать Safari для управления Mac’ом?

Я нашёл такое решение: надо задействовать PHP на моей машине с Mac OS X совместно с инструментарием iUI toolkit от Джо Хьюитта (Joe Hewitt). Этот инструментарий (toolkit) формирует на 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 символы угловых скобок (< или >) и амперсанда (&), их необходимо закодировать их как &lt;, &gt;, and &amp;, соответственно.

Для обработки этого XML-файла я создал в PHP 5-й версии класс Command, который считывает этот файл, возвращает имена команд и запускает их на выполнение, используя команду osascript из Mac OS X. Код, описывающий этот класс, представлен в листинге 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, используя PHP-класс DomDocument. Далее он извлекает все элементы command с помощью метода getElementsByTagName. Затем, сформировав массив элементов, полученных из <command>, конструктор определяет переменную экземпляра класса _commands, записывая в неё имена команд и соответствующие им AppleScript-команды.

В классе также определены два дополнительных метода:

  • Метод getCommands(), который просто возвращает список имён команд
  • Метод runCommand(), который выполняет команду, заданную порядковым номером, используя для этого osascript - консольный интерпретатор AppleScript-кода.


В начало


Создание интерфейса

После того как мы создали XML-файл со списком команд и описали PHP-класс Commands пора бы реализовать к ним некоторый интерфейс. Просто чтобы проверить, что всё нормально работает, создадим пока довольно примитивный интерфейс. Он показан в листинге 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=no;"/> <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> 

Вначале мы подключаем CSS-файл из iUI, который содержит все те стили, которые и придают странице iPhone-подобный вид. Далее подключаем JavaScript-файл из iUI, полностью реализующий динамику приложения. После этого с помощью класса Commands получаем список команд и формируем на его основе неупорядоченный список (<ul>), содержащий элементы списка (<li>) для каждого элемента. Нет, это не настолько ужасно, насколько звучит. На самом деле вы можете теперь открыть эту страницу в Safari, и она будет иметь точно такой же вид, как и в самом iPhone (см. рисунок 2.


Рисунок 2. Страница index.php, открытая в Safari
Страница index.php, открытая в Safari

Ничего страшного, если вы работаете под 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 и получить доступ к приложению, запустив Safari и открыв в нём страницу по IP-адресу моего локального компьютера. И всё это будет отлично работать, пока мои лэптоп и iPhone будут находиться в одной Wi-Fi-сети.



В начало


Телекинез

Когда я выполнял небольшое исследование для этой статьи, я обнаружил, что эта концепция удалённого управления Mac’ом с помощью iPhone уже реализована – причем на более высоком уровне. Проект называется telekinesis (телекинез), и его сайт размещён на Google Code. Соответствующее приложение получило название iPhone Remote и запускается под Mac OS X как приложение с графическим пользовательским интерфейсом (GUI-приложение).

Если запустить iPhone Remote, то он откроет в браузере Safari страницу, которая будет выглядеть точно так же как в iPhone и как показано на рисунке 3.


Рисунок 3. Интерфейс iPhone Remote
The iPhone Remote interface

Отсюда можно управлять приложениями и запускать их, просматривать документы, удалённо использовать iTunes и даже перемещаться по экрану и выполнять консольные команды—и всё это можно с iPhone.

iPhone Remote запрашивает имя пользователя и пароль, поэтому посторонний человек не сможет воспользоваться вашим Mac’ом, когда вы установили это приложение. Так что iPhone можно использовать как устройство для защищённой работы с данными в виртуальной рабочей сети (VNC - virtual network computing) вашего Mac’а.



В начало


Заключение

Разрабатывать под iPhone очень легко. Реклама утверждает , что iPhone предоставляет доступ к «настоящему» Интернету, а не к его мобильной версии, и это правда: с помощью iPhone можно просматривать обычные страницы так, как если бы они были открыты на Mac’е или PC. А такие инструментарии для создания интерфейса, как iUI помогают придать приложению более похожий на iPhone внешний вид и динамику, удобные для работы с приложениями, подобными приведенному здесь приложению iPhone-ПДУ, сделанному на XML и PHP.



Ресурсы

Научиться

Получить продукты и технологии
  • У вас есть iPhone?: теперь вы с гарантией не пропустите ни одной статьи из ленты developerWorks. Выберите тему, раздел, брэнд, статью, прочитайте аннотацию или посетите сам сайт. Всё это можно сделать с помощью вашего iPhone и этой ссылки: http://www.ibm.com/developerWorks/iphone.(EN)

  • Ознакомительное программное обеспечение от IBM: используйте в вашем следующем проекте программное обеспечение, которое можно загрузить непосредственно с developerWorks.(EN)


Обсудить


Об авторе


Джек Д. Херрингтон (Jack D. Herrington) - главный инженер-программист с более чем двадцатилетним опытом работы. Он автор трех книг: " Генерирование кода в действии ", " Podcasting Hacks " и " PHP Hacks ". Написал более 30 статей. Вы можете связаться с Джеком по адресу jherr@pobox.com.

Комментариев нет: