уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

С некоторых пор стал всё чаще приглядываться к работе в Mac OS X. В принципе, мне, как и раньше, разработка под эту ОС особенно не требуется, т.к. всё, чем я занимаюсь по работе в Delphi, относится исключительно к Windows. Но все же интересно узнать «как оно там всё устроено», да и, как стало известно, скоро нас ждет знакомство с Mobile Studio. А значит, небольшой навык работы с другой ОС пригодиться.

Началось мое знакомство с Mac OS X, как обычно, с «Hello, World» и там, собственно, никаких проблем и вопросов не возникло — PAServer установил, профиль настроил, приложение прекрасно собралось и запустилось. В этот раз я решил познакомиться с Mac OS X по-подробнее, посмотреть, как устроена сама ОС, какие возможности для работы есть для разработчиков вообще и, что нам дает сделать Delphi XE3.  В общем эта статья представляет собой краткое описание того, как устроена относительно новая для нас ОС и, одновременно, эдакая «попсовая интерпретация возможностей Delphi» (с) по работе с Mac OS X.

Содержание статьи:

 

Некоторые сведения о Mac OS X.

Текущее приложение и строка меню

Текущее приложение — это то приложение, окно которого активно в данный момент времени. Имя текущего приложения всегда можно узнать, посмотрев на строку меню вверху экрана. Имя текущего приложения располагается слева, сразу после логотипа Apple и выделяется жирным шрифтом. Например, на рисунке ниже показан вид меню, когда пользователь работает с адресной книгой:

Строка меню: текущее приложение

 

Как видно на рисунке, после названия располагаются все пункты меню текущего приложения. Вся верхняя строка и называется строкой меню. Строка меню изменяется при переключении между приложениями. В Mac OS X меню каждого приложения всегда располагается вверху экрана, его не требуется искать — достаточно переключиться на необходимое приложение и его меню отобразится вверху. Строка меню одна и располагается на рабочем пространстве главного монитора.

После пунктов меню с правой стороны строки меню располагаются иконки приложений и часы. Иконки приложений обычно служат для доступа к некоторым наиболее важным функциям запущенных приложений. Иконки делятся на два типа:

  • иконки пользовательских приложений
  • иконки приложений системы.

Иконки приложений системы располагаются правее иконок пользовательских приложений. Системные иконки:  громкость, время, текущая раскладка клавиатуры, лупа — поиск Spotlight.

Иконки приложений

Иконка яблока слева в строке меню предоставляет доступ к наиболее важным функциям системы: информация по системе, обновление операционной системы, доступ к Web-репозиторию программ (App Store), управление Доком (Dock), менеджер запущенных приложений, настройки системы, выход из системы, засыпание, перезагрузка и выключение компьютера.

Доступ к функциям системы

Службы (сервисы). Вызов служб.

В любой программе в меню совпадающем с именем приложения, располагаются ключевые пункты — такие как настройки программы, выход и службы или, говоря более привычными словами — сервисы . Службы позволяют произвести некоторую склейку функциональности некоторых приложений между собой, при этом знать о взаимных функциональных возможностях приложениям не требуется. Службы предоставляются установленными в системе приложениями и, как правило, действуют над некоторыми выделенными объектами в документах — такими как текст, картинки … Они позволяют быстро найти перевод слова, быстро переслать выделенный текст на почту или заставить внутренний синтезатор речи произнести его, добавить выделенный фрагмент текста или картинку в список дел… В списке «Службы» регистрируются функции всех установленных программ пользователя, предоставляющих сервисные функции. Если соответствующий пункт меню «Службы» активен — сервис может принять текущие входные данные, так для работы многих служб необходимо выделить объект над которым предполагается работа. На рисунке ниже я выделил текст в Терминале и вызывал список служб для работы с текстом:

Вызов сервиса

Если Вы забыли где находится тот или иной пункт меню, то достаточно воспользоваться пунктом меню «Справка» — наберите часть пункта меню или функции, которую Вы помните и система сама покажет Вам подменю где он находится:

Меню «Справка»

Finder

Если проводить аналогию между Windows и Mac OS X, то Finder — это рабочий стол. Собственно, об этом же говорит и сама Mac OS X:

О программе «Finder»

Finder предоставляет доступ к домашней директории, приложениям, подключению к серверам (протоколы), предоставляет быстрый доступ к часто посещаемым местам, полностью поддерживает Drag & Drop, быстрое сохранение фрагментов текста, перетаскивание файлов и папок, создание ярлыков и т.д. В общем, если Вы никогда не работали плотно с Терминалом, то Finder поможет очень быстро освоиться в новой операционной системе.

Dock

Dock в Mac OS X — это тоже самое, что и панель задач в Windows:

Dock

Выглядит Dock, конечно, по-солиднее, чем панель задач Windows, но суть та же — размещение иконок часто используемых приложений, вызов приложений, хранение ссылок (ярлыков) на документы и т.д.  Запущенные приложения помечаются специальным значком под иконкой (см. на рисунке выше иконку системных настроек).

Приложения делятся на постоянно «живущие» в Dock, и временные. Иконки временных приложений (редко используемые приложения) располагаются правее всех постоянных, и исчезают (схлопываются) после выхода из приложений. Чтобы перевести приложение из категории временных — перетащите (удерживая левую кнопку мыши) его иконку левее (прочие иконки будут раздвигаться, уступая место), либо выберите в контекстном меню (по правой кнопке) — «Оставить в Dock». Чтобы удалить приложение из Dock — перетащите иконку приложения за пределы Dock (покажется серое облачко) и отпустите там, либо в контекстном меню выберите — «Удалить из Dock».

Правее иконок приложений, через разделительную полосу, находится специальная зона для ссылок, папок, стеков; замыкает этот список Корзина.

В общем и целом, к работе с Mac OS X привыкаешь довольно быстро — буквально часик работы как-то уже свыкаешься с окружением, не «паришься»  с расположением меню и т.д. Другое дело, когда касаешься разработки приложения под Mac OS X — вот тут есть над чем задуматься, после долгих лет работы с Windows и его WinAPI.

Кратко об архитектуре OS X

OS X имеет многоуровневую архитектуру, где на каждом уровне располагаются ключевые технологии. В самом общем виде архитектуру OS X можно представить следующим образом:

Архитектура OS X

Рассмотрим назначение каждого из уровней архитектуры.

Cocoa Layer

Уровень Cocoa, в основном, отвечает за внешний вид приложений и их способности реагировать на действия пользователя. Кроме того, этот же слой отвечает за многие функции, которые определяют пользователи OS X, такие как полноэкранный режим, AutoSave и т.д.

Cocoa Layer содержит фреймворк AppKit. AppKit является ключевой основой для разработки приложений. Классы и интерфейсы AppKit реализуют пользовательский интерфейс (UI) приложений, в том числе окон, диалоговых окон, элементы управления, меню и обработку событий. Они также управляют окнами, документами, диалогами типа Открыть и Сохранить, Копировать в буфер обмена и т.д. В дополнение к классам окон, меню и обработки событий в AppKit, также содержатся классы для работы со шрифтами, цветами, изображениями и т.д. 

Также в Cocoa Layer «живут» такие фреймворки как:

  • GameKit
  • Preferences Panes
  • Screen Saver Framework
  • SecurityInterface

 Что касается Cocoa Layer, то здесь большинство (если не все) интерфейсов так или иначе задействованы в работе FireMonkey 2.0., поэтому врядли нам потребуется напрямую использовать Appkit в своих приложениях, но, тем не менее, стоит сказать, что для работы с Cocoa Layer в Delphi сейчас имеются такие модули как Macapi.CocoaTypes и Macapi.AppKit.

Media Layer

С Media Layer разработчики получают возможность разрабатывать красивые приложения с различными эффектами, воспроизведением видео/аудио и т.д. В общем, если AppKit в Cocoa дает нам возможность разрабатывать приложение вообще, то в Media Layer содержатся фреймворки, используя которые можно сделать красивое и функциональное приложение.  Например, в Media Layer мы можем найти такие фреймворки:

  • AudioToolbox
  • AudioUnit
  • AVFoundation
  • CoreAudio
  • CoreAudioKit
  • CoreMIDI
  • CoreMIDIServer
  • DiscRecording
  • DiscRecordingUI
  • DVDPlayback
  • GLKit
  • IMServicePlugIn
  • InstantMessage
  • OpenAL
  • OpenGL
  • QTKit
  • Quartz
  • QuartzCore
  • QuickTime
  • SceneKit

Так, если большая часть названий в списке выше разработчикам под Windows может быть не известна, то уж с QuickTime и OpenGL мы могли сталкиваться и без разработки приложений и представляем что это и для чего это. Что на данный момент реализовано в Delphi из представленного выше перечня? В Delphi мы можем найти следующие модули для работы:

 

  • Macapi.AVFoundation
  • Macapi.CoreMedia
  • Macapi.OpenGL
  • Macapi.QuartzCore
  • Macapi.Quicktime

 

Core Services Layer

На уровне Core Services располагаются фреймворки, позволяющие взаимодействовать с ОС на более низком уровне — получать доступ к различным типам данных, к соккетам для работы с сетью и т.д. Т.е. на этом слое мы начинаем углубляться в детали OS X. Так, например, используя фреймворк Foundation, мы можем работать с XML или получать доступ к рабочему пространству пользователя, например, чтобы запустить какое-либо приложение, получать информацию о запущенных приложениях и взаимодействовать с ними и т.д. Но обо всем этом чуть-чуть по-ниже. Итак, какие фреймворки содержатся в Core Services:

Что имеется в Delphi XE3:
  • Macapi.CoreFoundation
  • Macapi.CoreLocation
  • Macapi.CoreMedia
  • Macapi.CoreServices
  • Macapi.Foundation
  • Macapi.Security

Core OS Layer

На уровне Core OS мы получаем в свое распоряжение классы интерфейсы для низкоуровневой работы с OS X, которых нам могло не хватить при работе с  Core Services. Так, например, Core OS Layer содержит фреймворк SystemConfiguration с помощью которого мы можем получить доступ к настройкам самой операционной системы, управлять сетевыми соединениями и т.д.

На этом уровне работают следующие фреймворки:

  • CoreBluetooth
  • IOSurface
  • Accelerate
  • AGL
  • DirectoryService
  • DiskArbitration
  • ExceptionHandling
  • OpenCL
  • SystemConfiguration
  • XgridFoundation

 

Что имеется в Delphi XE3 по части работы на уровне Core OS:

  • Macapi.SystemConfiguration

Kernel & Driver Layer

На этом уровне реализуются классы и интерфейсы для доступа к ядру OS X и «железу» компьютера. Т.е. здесь «только хардкор» :) Причем на столько суровый, что даже как-то пока нет желания глубоко копать в этом направлении. На уровне Kernel & Driver используются следующие фреймворки:

Что имеется в Delphi XE3 по части работы на этом уровне я пока не обнаружил…может быть даже и ничего. Если ошибаюсь, то подскажите — буду знать :)

Как видите, в Mac OS X все не так уж и запутано и непонятно, как могло бы показаться при первом знакомстве. В зависимости от наших потребностей, выбираем необходимый уровень архитектуры — Cocoa, Media, Core Services и т.д., выбираем необходимый фреймворк и начинаем разработку. Конечно, чтобы разобраться с возможностями всех фреймворков уйдет не один месяц кропотливой работы, но кое-что можно реализовать уже сейчас.

Приложение Mac OS X. Структура бандла (bundle)

Прежде, чем мы начнем рассмотрение примеров работы с различными фреймворками Mac OS X, давайте немного отвлечемся и посмотрим, что из себя представляет обычное приложение Mac OS X. Для примера, создадим простейшее приложение для Mac OS или воспользуемся тем же «Hello, Mac OS!». Помню ещё когда работал на старой работе и активно использовал там Lazarus, то для меня тогда стало неожиданность то, что файл OpenOffice на поверку оказался обычным архивом с определенной структурой файлов :). Теперь же,  когда дело дошло до Mac OS, то удивления от того, что с позиций Windows приложения Mac OS X является обычно директорией с файлами как-то не возникло. Проверить это довольно просто:

1. Собираем проект и «скармливаем» его PAServer’у на машине с Mac OS.

Вот запущенное приложение и оно же в директории Applications Mac-машины:

Приложение Mac OS X

Приложение Mac OS X

2. Копируем приложение на Flash и смотрим, что у нас получается в Windows:

Как видите в ОС Windows наше приложение Mac OS стало обычной директорией. И это полностью соответствует идеологии Mac OS. Дело в том, что в Mac OS X все приложения, библиотеки, компоненты и составные документы оформляются в виде бандлов (bundle). И

на уровне файловой системы бандл представляется директорией с иерархией вложенных директорий и файлов.

Bundle содержит в себе код и ресурсы приложения или составного документа. Документы и приложения представленные бандлами часто, по аналогии с ОС Linux,  также могут именоваться как package — пакет. Для работы с бандлами в Mac OS X существуют специальные классы Cocoa, такие как: NSBundle, NSFileWrapper и др.

Кстати, мы могли бы и не переносить наше приложение для просмотра содержимого в Windows. Для просмотра содержимого бандла достаточно вызвать контекстное меню и выбрать пункт «Показать содержимое пакета»:

(На время последнего изменения файлов не обращайте внимание :) Просто виртуалка не настроена)

Итак, что содержит бандл? В бандле приложения могут находится следующие компоненты файлы (не полный список):

  • Contents/Info.plist — файл метаописания приложения
  • Contents/MacOS/исполняемыйФайл — бинарный исполняемый файл, который запускается при старте приложения. В директории MacOS также могут содержатся и другие бинарные файлы, например, динамические библиотеки, необходимые для работы приложения.
  • Contents/Resources/ — здесь располагаются различные ресурсы необходимые приложению — картинки, строки, локализации, наборы иконок и т.д.
  • Contents/Resource Disabled/ — Finder перемещает временно отключенные языковые ресурсы в эту директорию
  • Contents/Frameworks/ — приватные библиотеки необходимые для работы приложения
  • Contents/SharedFrameworks/ — аналогично Frameworks — библиотеки необходимые для работы приложения, а также доступные для использования за его пределами
  • Contents/SharedSupport/ — некритические ресурсы (не оказывающие влияния на способность текущего приложения выполняться) — вспомогательные цели (приложения, документы, шаблоны, руководства, …)
  • Contents/PlugIns/ — вспомогательные модули (plugins)

С тем, что такое бандл и что из себя представляет бандл немного разобрались. Теперь попробуем поработать с фреймворками Mac OS X.

Foundation и Appkit Framework в Delphi XE3

Пример №1. Получение информации о текущем приложении

Раз уж мы закончили наш обзор Mac OS X на бандлах, то и рассмотрение примеров начнем с них же. И в первом примере мы получим информацию о нашем приложении (бандле). Подключаем в uses модуль macapi.foundation, кидаем на главную форму приложения кнопку (TButton), список  (TlistBox) и пишем такой код в обработчике OnClick кнопки:

procedure TForm8.Button1Click(Sender: TObject);
var MainBundle: NSBundle;
begin
  //получаем бандл текущего приложения
  MainBundle:=TNSBundle.Wrap(TNSBundle.OCClass.mainBundle);
  ListBox1.Items.Add('----Информация по текущему приложению----');
  ListBox1.Items.Add('Название приложения: '+MainBundle.bundleIdentifier.UTF8String);
  ListBox1.Items.Add('Путь к бандлу: '+MainBundle.bundlePath.UTF8String);
  ListBox1.Items.Add('Путь к исполняемому файлу: '+MainBundle.executablePath.UTF8String);
end;
В этом примере мы получили информацию по текущему приложению. Для доступа к информации по другим приложениям можно воспользоваться, например, методом allBundles, который вернет NSArray, содержащий информацию по всем бандлам, исключая фреймворки

Теперь запускаем наше приложение на Mac-машине и смотрим, что вернет нам программа:

Пример №2. Аналог ShellExecute в Mac OS X.

Что нам необходимо сделать при разработке приложения для Windows, чтобы, например, открыть URL в браузере по умолчанию? Конечно, мы пишем что-то наподобие такого:

uses  ...WinAPI.Windows,ShellAPI;
...
begin
  ShellExecute(0, 'open', PChar(aURL), nil, nil, SW_SHOWNORMAL);
end;

Как быть, если нам необходимо выполнить то же самое действие, но уже в Mac OS X? Здесь нам, наряду с Foundation, на помощь приходит фреймворк AppKit. Для открытия URL в браузере по умолчанию нам необходимо:

  1. Получить доступ к рабочему пространству пользователя (NSWorkspace)
  2. Реализовать интерфейс NSURL
  3. Вызвать метод OpenURL у NSWorkspase

Реализуем это на примере. Подключаем в Uses модуль macapi.AppKit, бросаем на форму ещё одну кнопочку TButton и пишем такой код:

procedure TForm8.Button2Click(Sender: TObject);
var
  WS: NSWorkspace;
  URL: NSURL;
begin
  WS:=TNSWorkspace.Wrap(TNSWorkspace.OCClass.sharedWorkspace);
  URL:=TNSURL.Wrap(TNSURL.OCClass.URLWithString(NSSTR('http://webdelphi.ru')));
  WS.openURL(URL);
end;

Скрин тут приводить особого смысла нет, просто поверьте на слово, после клика на кнопке запуститься браузер и откроет главную страничку блога webdelphi. Посмотрим, что мы здесь написали.

WS:=TNSWorkspace.Wrap(TNSWorkspace.OCClass.sharedWorkspace);

Получили доступ к рабочему пространству.

URL:=TNSURL.Wrap(TNSURL.OCClass.URLWithString(NSSTR('http://webdelphi.ru')));

Получили NSURL, который необходимо передавать в метод NSWorkspase.OpenURL. Этот код мы могли бы представить и более подробно, например, так:

var NString: NSString;
    URL: NSURL;
begin
  NString:=NSSTR('http://webdelphi.ru');
  URL:=TNSURL.Wrap(TNSURL.OCClass.URLWithString(NString));
end;

Здесь метод NSSTR — это вспомогательный метод, содержащийся в модуле Macapi.Foundation, который выглядит следующим образом:

function NSSTR(Str: string): NSString;
var
  M: TMarshaller;
begin
  Result := TNSString.Wrap(TNSString.OCClass.stringWithUTF8String(M.AsAnsi(Str, CP_UTF8).ToPointer));
end;

Теперь, вооружившись новыми знаниями, мы можем легко написать универсальный метод открытия URL в браузере по молчанию, который будет работать одинаково как в Windows, так и в Mac OS X:

uses ... {$IFDEF MSWINDOWS}WinAPI.Windows,ShellAPI{$ENDIF}
         {$IFDEF MACOS}Macapi.AppKit, macapi.Foundation{$ENDIF};
procedure OpenURLInBrowser(aURL: string);
{$IFDEF MACOS}
var
  WS: NSWorkspace;
  URL: NSURL;
{$ENDIF}
begin
{$IFDEF MACOS}
  WS:=TNSWorkspace.Wrap(TNSWorkspace.OCClass.sharedWorkspace);
  URL:=TNSURL.Wrap(TNSURL.OCClass.URLWithString(NSSTR(aURL)));
  WS.openURL(URL);
{$ENDIF}
{$IFDEF MSWINDOWS}
  ShellExecute(0, 'open', PChar(aURL), nil, nil, SW_SHOWNORMAL)
{$ENDIF}
end;

Используя методы NSWorkspace мы также можем запускать другие приложения, открывать различные файлы, получать информацию по запущенным приложениям и т.д.

Примеры Delphi XE3 по работе с данными в Mac OS X

Думаю, что нет особого смысла копировать в этот пост исходник примера по работе с данными в Mac OS X, но упомянуть его стоит. Если вы хотите поразбираться с Foundation Framework — советую изучить пример XMLonMac. В этом приложении рассматривается пример того как можно работать с XML в Mac OS X, используя интерфейсы Foundation Framewok.

Также про работу с XML в Mac OS Вы можете узнать из статьи «Delphi XE3: работа с XML в Mac OS X»

Однако примерчик этот несколько однобок — довольно ясно и понятно показано как собрать XML-документ, но отсутствует пример того как парсить (читать) XML. Ок, раз так, то пусть чтение XML в Mac OS X останется для нас небольшим домашним заданием :)

В заключение статьи небольшое видео от Embarcadero под названием «Building a FireMonkey 2 OSX Application and Submitting it to the Apple Mac App Store». Смотрим, вникаем и пробуем собрать что-нибудь свое:

[youtube_sc url=»http://www.youtube.com/watch?v=W6Zd71_L8aw»]

Источники информации для этой статьи:

  1. Mac Developer Library — официальная библиотека Mac-разработчика.
  2. Введение в Mac OS X — курс по Mac OS X и Objective-C на русском языке.
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
5 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Всеволод Леонов

Замечательный, полный важной и полезной информации пост. Дозированная подача в максимально доступной форме!

Влад, но можно ли тебя попросить написать «субъективный, пользовательский» пост. Не «глазами разрабочика», а глазами «юзера». Я уже больше года вялотекуще использую Мак ОС (из-за стероидной батареи соотв. дивайса), но пока не вижу какой-то сверхъестественной эстетики. Ты во многом являешься для сообщества Delphi-программистов ещё и «эстетическим ориентиром». Напиши своё мнение, пожалуйста, и об этой стороне Мак ОС.

Всеволод Леонов

>>…и получится примерно то же самое :)
Злой ты, недобрый. Не угодить на тебя никак. И это выдает в тебе тонко-чувствующую натуру, поэтому так и останешься — «эстетическим ориентиром».

Дай мне сорсы клиента к DelphiFeeds.ru на мак-овую перекомиляцию. Или сам сделай :)

trackback
Delphi XE3: работа с XML в Mac OS X. | Delphi в Internet
04/02/2013 16:58

[…] я уже говорил в предыдущей статье, посвященной работе с Mac OS X в Delphi XE3, в примерах к RAD Studio […]