- PVSM.RU - https://www.pvsm.ru -

Apportable SDK — Objective-C/Cocoa Touch для Android

Apportable SDK [1] — это продукт, который позволяет без изменений скомпилировать игру (или приложение), разработанное на Objective-C/Cocoa Touch для iOS под Android. Это полный toolchain (компилятор, дебаггер, линковщик — все-все-все), работающие Foundation, CoreFoundation, UIKit, множество других фреймворков из состава iOS, перенесенные на Android (даже такая «мелочь» как GameKit и StoreKit, с бэкендами для GooglePlus и Amazon GameCircle/Appstore).

Цель Apportable — дать iOS разработчику перенести свое приложение на Android за час, без изменения кода, и поддерживать после этого одну кодовую базу. Как портировать простую игрушку на cocos2d — под катом

Заходим на сайт Apportable [1].

После регистрации [2] нам дают выкачать SDK, ссылка специфичная для пользователя.

Выкачиваться оно будет очень долго — Apportable использует патченные android-sdk, ndk и прочую тяжелую артиллерию.

После установки оно скажет:


Toolchain downloaded into /Users/darvin/.apportable/toolchain.
Apportable CLI is successfully installed at /Users/darvin/.apportable/SDK/bin/apportable
If you're using the default shell, add the Apportable CLI to your PATH using:
(echo; echo 'PATH="/Users/darvin/.apportable/SDK/bin:$PATH"') >> ~/.bash_profile; source ~/.bash_profile

Так и делаем:

$ echo; echo 'PATH="/Users/darvin/.apportable/SDK/bin:$PATH"') >> ~/.bash_profile; source ~/.bash_profile

Теперь выкачаем нашего подопытного кролика, какую-нибудь рандомную опенсорсную игру с гитхаба [3], запиленную на Objective-C/Cocos-2d (поддержка cocos2d у apportable особо хороша, они даже являются оффициальным спонсором cocos2d [4]). Дисклеймер: автор не имеет никаго отношения к подопытной игре, она совершенно не адаптированна для Apportable SDK, просто игра на cocos2d

$ git clone https://github.com/haqu/climbers.git
$ cd climbers

Проверяем, чтобы компилировалось из XCode:

$ open climbers.xcodeproj

Подключаем любимый Нексус (или галакси, или нонейм-китайца без google-apps — нет почти никакой разницы), запускаем утилиту, которая создаст climbers.approj (это набор настроек для Apportable, которые накладываются поверх .xcodeproj), скомпилирует проект и загрузит его на девайс:

$ apportable load

Утилита вначале спросит:


If the app is using OpenGL ES, does it use ES1 or ES2? (Cocos2D 1.X uses ES1, 2.X uses ES2)
[1/2] 1
Should the app initially launch in landscape or portrait orientation? (default: landscape)
[L/p] p

Игрушка использует Cocos2D 1.X, так что отвечаем «1», второй вопрос — «p».

После первой попытки компиляция отваливается с сообщениями об ошибках:


/Users/darvin/GAMES/climbers/Support/CocosDenshion/CDAudioManager.m:322: error: undefined reference to 'AudioSessionGetProperty'
/Users/darvin/GAMES/climbers/Support/CocosDenshion/CDAudioManager.m:382: error: undefined reference to 'AVAudioSessionCategoryPlayAndRecord'
...вырезано...
/Users/darvin/GAMES/climbers/Support/CocosDenshion/CDOpenALSupport.m:227: error: undefined reference to 'ExtAudioFileDispose'
Updating Jar...
scons: *** [Build/android-armeabi-debug/climbers/apk/lib/armeabi/libverde.so] Error 1
scons: building terminated because of errors.

Оно жалуется на отсутствующие AudioFile* функции… Гугль подсказывает, что они находятся в фреймворке AudioToolbox. Ну что ж…

$ vim climbers.approj/configuration.json

В разделе "add_params" находим строки:

    // A list of dependencies.  Typically these correspond to
    // frameworks in the xcode project.
    "deps": [""],

Исправляем на:

    "deps": ["AudioToolbox"],
$ apportable load

Игра загружена на подключенный Android мобильник, даже есть звук. Графика немного сьехала — разработчик не расчитывал на разные разрешения андроидофонов, впрочем, это легко (и нужно) исправить, если же адаптировать графику лень, Apportable представляет workaround [5], который будет масштабировать графику, как если бы игра была запущена на iOS девайсе. Давайте попробуем второй путь:

В начале -[AppDelegate applicationDidFinishLaunching:] добавим:

#ifdef APPORTABLE
    [UIScreen mainScreen].currentMode =
    [UIScreenMode emulatedMode:UIScreenBestEmulationMode];
#endif

Здесь мы выставляем лучший режим эмуляции для девайса — если его разрешение/пропорции похожи на iPad — он будет эмулировать iPad, если на iPhone — iPhone.

Также стоит удалить ненужный код выбора ориентации:

#if GAME_AUTOROTATION == kGameAutorotationUIViewController
    [director setDeviceOrientation:kCCDeviceOrientationPortrait];
#else
    [director setDeviceOrientation:kCCDeviceOrientationLandscapeLeft];
#endi

Сохраняем, запускаем коммандой apportable load. Видим Objective-C/Cocos 2d игрушку на Нексусе:

image

Форк игрушки [6] после портирования на Андроид. Всего один конфиругационный файл добавлен, пять строчек изменено в AppDelegate [7]

Полный листинг сессии портирования [8]

Доступна документация [9] и список рассылки [10]. Также наши специально обученные инженеры мониторят тэг на StackOverflow [11]. Видео [12] сессии портирования tweejump [13].

Starter редакция SDK бесплатна [14], подерживается Android 4+. Лучше всего Apportable подходит для портирования игр — у приложений все равно разные гайдлайны UI, a игры уже обкатаны на множестве лидеров аппстора [15]. Буду рад ответить на любые вопросы, в следующей статье собираюсь рассказать как быстро и безболезненно выдрать возникающие при портировании баги и прозрачно, без изменения кодовой базы интегрировать социальные фреймворки, StoreKit [16] и GameKit.

Автор: sergeyklimov

Источник [17]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/ios/41233

Ссылки в тексте:

[1] Apportable SDK: http://apportable.com

[2] регистрации: https://www.apportable.com/account/new

[3] рандомную опенсорсную игру с гитхаба: https://github.com/haqu/climbers

[4] являются оффициальным спонсором cocos2d: http://www.cocos2d-iphone.org/forums/topic/apportable-has-become-the-official-cocos2d-sponsor/

[5] workaround: http://docs.apportable.com/uikit-extensions.html#uiscreen

[6] Форк игрушки: https://github.com/darvin/climbers

[7] Всего один конфиругационный файл добавлен, пять строчек изменено в AppDelegate: https://github.com/darvin/climbers/commit/39b369a8949b78f803a1ca1e1b15b5b4b3c9f982

[8] Полный листинг сессии портирования: https://gist.github.com/darvin/6248126

[9] документация: http://docs.apportable.com/index.html

[10] список рассылки: https://groups.google.com/forum/#!forum/apportable-discuss

[11] тэг на StackOverflow: http://stackoverflow.com/questions/tagged/apportable

[12] Видео: http://www.youtube.com/watch?v=40rAtzemb-4

[13] tweejump: https://github.com/haqu/tweejump

[14] бесплатна: http://www.apportable.com/pricing

[15] множестве лидеров аппстора: http://www.apportable.com/customers

[16] StoreKit: http://docs.apportable.com/publishing.html#storekit-google-play

[17] Источник: http://habrahabr.ru/post/190560/