Статьи

Создание собственных iOS-приложений с помощью воска: Введение

Идея, лежащая в основе Wax Framework, проста: все, что может сделать Objective-C, может сделать и Lua! Существует множество веских причин для создания собственных приложений iPhone с простым и эффективным языком сценариев, таких как Lua, и эта серия учебных пособий расскажет о преимуществах, предлагаемых Wax, а также продемонстрирует практические шаги, необходимые для интеграции Lua с Xcode 4 и iOS. SDK.

Wax for iPhone — это фреймворк, созданный таким образом, чтобы связать язык сценариев Lua и нативный API Objective-C. Это означает, что вы можете использовать любые классы и платформы Objective-C из Lua.

С технической точки зрения, Wax — это комбинация классов Objective-C и нативного кода на языке C. Язык Lua встроен в C, а затем классы Objective-C объединяются в микс.

Воск бесплатный и с открытым исходным кодом . В отличие от некоторых других решений на основе Lua для разработки мобильных приложений, Wax — это платформа с открытым исходным кодом, которая требует лишь немного времени для работы, а не денег. Не нравится, как работает Wax или вы нашли ошибку в реализации? Исходный код находится в свободном доступе, и вы всегда можете изменить его в соответствии со своими потребностями.

Вы можете использовать собственные API . Это означает, что учебные пособия, написанные для обучения Objective-C, могут быть легко адаптированы и написаны с Lua для Wax. Это также означает, что ваше приложение всегда будет выглядеть и чувствовать себя нативно, но вы все равно сможете сэкономить время, написав свой код на Lua, эффективном языке сценариев.

Вы можете использовать Xcode . Это означает, что развертывание как симулятора, так и устройства является несложным делом и не должно легко сломаться в будущем выпуске iOS.

Вы можете использовать все существующие библиотеки Objective-C . Если у вас есть класс Objective-C, который вы написали ранее, вы можете использовать его в Lua — без каких-либо адаптаций — вы просто добавляете его в Xcode. То же самое относится и к библиотекам вроде Three20. Просто добавьте их в соответствии с обычными инструкциями, и у вас есть доступ к ним в вашем коде Lua.

Вы можете использовать модули Wax Lua . В Wax есть несколько встроенных модулей Lua, которые делают асинхронные HTTP-запросы и создание / анализ JSON невероятно легкими и быстрыми (потому что модули написаны на C).

Вам не нужно управлять памятью . Нет больше выделения памяти и тому подобное. Воск обрабатывает все это для вас.

Типы Lua автоматически конвертируются в эквиваленты Objective-C и наоборот . Это означает, что когда вы вызываете метод, которому требуется NSString и NSInteger, но вы передаете строку Lua и целое число Lua, об этом позаботится Wax. Это преобразование даже достаточно мощное, чтобы обрабатывать сложные функции Objective C, такие как селекторы.

Вы можете использовать ВСЕ из вышеперечисленного . Нет необходимости выбирать. Вы получаете все это!

Ну, во-первых, вам нужен Xcode и iPhone SDK. Если у вас их еще нет, иди за ними!

Давайте начнем с создания нового «оконного проекта» под названием «WaxApplication». Не забудьте установить устройство на iPhone:

Pick Window-based проект
Назовите это WaxApplication

Перейдите в папку, где вы сохранили этот проект в Finder. Создайте три новые папки: воск, сценарии и классы. Ваша папка должна выглядеть так:

Ваша папка проекта должна выглядеть так

Сначала скачайте zip исходного кода. Воск размещен на GitHub, что делает загрузку исходного кода очень простой. Загрузите почтовый индекс отсюда .

Теперь разархивируйте только что загруженный файл. Перейдите к недавно извлеченной папке. Это будет называться что-то вроде «вероятно-Корея-воск-124ca46».

Теперь ваш экран должен выглядеть так:

Pick Window-based проект

Теперь выполните следующие действия:

  • Скопируйте папку lib и bin и вставьте их в папку wax, расположенную в папке проекта WaxApplication.
  • Скопируйте xcode-template / Classes / ProtocolLoader.h в папку проекта WaxApplication.
  • Скопируйте папку xcode-template / scripts / и поместите ее в папку проекта WaxApplication.
  • Откройте папку wax / lib / extensions / в папке проекта WaxApplication. Удалите папку SQLite & xml, изображенную ниже:
Ваша папка проекта должна выглядеть так

Ваш экран должен выглядеть так:

Ваша папка проекта должна выглядеть так

Теперь выберите классы, сценарии и восковые папки в Finder и перетащите их в проект Xcode. Перетащите их прямо под панель с надписью «Wax Application» и «1 target, iOS SDK XX». Снимите флажок «Копировать элементы в папку целевой группы (при необходимости)». Нажмите готово.

Теперь нажмите на строку с надписью «Wax Application» и «1 target, iOS SDK 4.3». Теперь сделайте следующие шаги:

  • В правой панели найдите заголовок «Targets» и нажмите «WaxApplication». Перейдите на вкладку «Этапы сборки». Нажмите «Копировать Bundle Resources» и удалите все файлы lua.
  • В правом нижнем углу нажмите «Добавить этап сборки», затем «Добавить сценарий запуска»
  • Установите для Shell значение / bin / zsh
  • Задайте для текстовой области под Shell значение «» $ PROJECT_DIR / wax / lib / build-scripts / copy-scripts.sh «»

Теперь ваш экран должен выглядеть так:

Ваша папка проекта должна выглядеть так

В левой панели откройте папку «WaxApplication». Затем откройте папку «Вспомогательные файлы». Затем откройте main.m и замените содержимое файла следующим:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
// This where the magic happens!
// Wax doesn’t use nibs to load the main view, everything is done within the
// AppDelegate.lua file
#import <UIKit/UIKit.h>
 
#import «wax.h»
#import «wax_http.h»
#import «wax_json.h»
#import «wax_filesystem.h»
 
int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 
    wax_start(«AppDelegate.lua», luaopen_wax_http, luaopen_wax_json, luaopen_wax_filesystem, nil);
 
    int retVal = UIApplicationMain(argc, argv, nil, @»AppDelegate»);
    [pool release];
    return retVal;
}

Не забудьте сохранить файл!

Удалите файлы MainWindow.xib, WaxApplicationAppDelegate.h и WaxApplicationAppDelegate.m. Откройте «WaxApplication / Supporting Files / WaxPallication-Info.plist», а затем удалите строку, где ключом является «Основное имя файла основного пера».

Нажмите ⌘↵ (Command + Enter) или нажмите «Выполнить» в верхнем левом углу, чтобы запустить приложение в симуляторе. Если все работает, вы увидите простое приложение с надписью «Привет, Луа!».

Если вы не видите это сообщение, просмотрите предыдущие шаги и посмотрите, пропустили ли вы шаг.

Разверните коллекцию Scripts и откройте AppDelegate.lua. Теперь вы видите код Lua, который поддерживает это приложение.

Первое, что вы, вероятно, заметите, это отсутствие подсветки синтаксиса. К сожалению, я не нашел стабильного решения для подсветки синтаксиса Lua в XCode (но если вы его найдете, пожалуйста, оставьте его в комментариях!).

Второе, что вы, вероятно, заметите, это отсутствие квадратных скобок, но используются такие классы, как UIScreen и UIWindow. Это потому, что вы создаете класс AppDelegate в Lua, и, насколько Apple и код Apple могут сказать, вы используете Objective-C и создаете классы Objective-C!

Вы также можете заметить странное имя метода «colorWithRed_green_blue_alpha». Если вы знакомы с Objective-C, вы будете знать, что имена методов могут иметь двоеточия. Вы не можете иметь двоеточия в именах функций в Lua. Чтобы компенсировать эту разницу, в любом месте имя метода разбито в Objective-C, в Lua есть подчеркивание. Например:

  • colorWithRed: зеленый: синий: альфа в Objective-C — это colorWithRed_green_blue_alpha в Lua
  • selectRowAtIndexPath: animated: scrollPosition: в Objective-C есть selectRowAtIndexPath_animated_scrollPosition в Lua.

Другая проблема с Lua заключается в том, что у него нет системы наследования, такой как Objective-C. В Lua вообще нет уроков. Чтобы обойти эту проблему, Wax предоставляет функцию, которая идет вверху каждого файла Wax Lua: waxClass. В AppDelegate.lua по умолчанию строка выглядит так:

1
waxClass{«AppDelegate», protocols = {«UIApplicationDelegate»}}

Для создания класса Objective-C из Lua используется функция waxClass {«CLASS NAME», «PARENT_CLASS»}. Все последующие функции (в том же файле), которые вы добавляете в этот файл Lua, будут автоматически добавляться в ваш новый класс как методы экземпляра.

Как показывает строка из AppDelegate.lua, вы также можете определить, какие протоколы определяет ваш «класс».

Хотя waxClass решает проблему определения классов для использования в Objective-C, все еще существует проблема, заключающаяся в том, что, поскольку Lua не имеет классов, у него нет динамической переменной «self», такой как Objective-C. Чтобы обойти это, Wax автоматически делает первый аргумент каждого метода текущим экземпляром класса. Когда вы смотрите на «applicationDidFinishLaunching» в AppDelegate.lua, вы можете видеть, что первым аргументом является «self», событие, хотя версия этого метода для Objective C имеет только 1 аргумент. Однако было бы очень неприятно, если бы вы передавали текущий экземпляр класса в качестве первого аргумента каждому методу, поэтому был добавлен некоторый синтаксический сахар. Вместо вызова метода в Lua, используя «.» оператор, оператор «двоеточие» используется:

1
2
3
4
5
local view = UIView.initWithFrame(CGRect(0, 0, 100, 100))
 
— the following are exactly the same
view:addSubview(someView)
view.addSubview(view, someView)

Еще одна важная вещь, которую стоит отметить, это то, что Wax не поддерживает свойства Objective-C. Воск заставляет Lua и Objective-C общаться только методами.

1
2
3
4
5
— This WILL NOT work.
someView.frame
— You want to use the getter/setter methods instead
someView:frame()
someView:setFrame(someFrame)

Вы можете динамически создавать переменные-члены для любого объекта Objective-C, используя точку. оператор. В отличие от оператора двоеточия: (используется для вызова методов в классе / экземпляре Objective C) точка. Оператор динамически создает переменные-члены на стороне объекта Lua (сторона объекта Objective-C не знает об этих переменных). Переменные-члены доступны в течение всего времени существования объекта.

AppDelegate.lua также показывает, как вы можете записать отладочный текст в консоль. Вы используете функцию «ставит».

Если вы помните, я обещал, что вам никогда не придется выделять, удерживать и освобождать вместе с Луа. Вам никогда не нужно вызывать alloc до вызова любого из инициализаторов. Фактически, если вы это сделаете, ваша программа, вероятно, будет иметь утечку памяти.

Теперь, когда вы хорошо разбираетесь в основах специфичного для воска Lua, вы готовы написать приложение для iPhone!

Во второй части этого руководства мы создадим пример приложения для Twitter с кнопкой обновления, используя всего несколько строк Lua.