Поиск по этому блогу

воскресенье, 6 января 2013 г.

Проблемы загрузки XIB-файлов во Flash приложение. Конвертация в NIB.

Суть проблемы:
Если ваше нативное расширение использует XIB файлы, то для работы во Flash приложении, эти файлы необходимо положить в каталог с приложением, и запаковать эти файлы в IPA. При попытке загрузить XIB файл во Flash приложение, компилятор ругается ошибкой. Опытным путем выяснил что XIB файл необходимо конвертировать в NIB. Для справки: NIB файл это тоже самое что и XIB только в другом формате. С чем связаны капризы Flash Builder и почему ему не нравятся XIB - выяснить не удалось. Если кто знает - поделитесь.

В итоге для использования XIB файлов, необходимо сделать следующее:
  1. Конвертировать все XIB файлы в NIB
  2. Запаковать NIB файлы в IPA с помощью компилятора Flash Builder 

 Конвертация XIB->NIB
 Для того что бы конвертировать XIB файл в NIB, необходимо в командной строке использовать утилиту ibtool. Утилита лежит в каталоге приложения Xcode. Ниже приведен sh-скрипт с примером конвертации:

#!/bin/bash

# путь до утилиты
ibtool="/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool"
# параметры утилиты: выводить на экран результаты выполнения:
parameters="--errors --warnings --notices --output-format human-readable-text"
# путь до каталога SDK
sdkPath="/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk"
# путь до исходного XIB файла
xibFile="../project/MyXibFile.xib"
# путь до NIB файла, который мы хотим сгенерировать
nibFile="../bin/MyNewNibFile.nib"

# собственно команда конвертации:
$ibtool $parameters --compile $nibFile $xibFile --sdk $sdkPath 

Конечно же не удобно каждый раз после изменения XIB файла, дергать этот скрипт руками что бы создать новый измененный NIB, тем более если XIB файлов в проекте множество. Для автоматизации в своих проектах я написал sh-скрипт который ищет все XIB файлы в каталоге xcode-приложения, и конвертирует их в соответствующие NIB файлы.
ibtool="/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool"
parameters="--errors --warnings --notices --output-format human-readable-text"
sdkPath="/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk"

# путь до каталога проекта, где лежат XIB файлы
xibsPath="../project/xcode/"
# путь до каталога куда складировать сгенерированные NIB файлы
buildPath="../project/flash/bin/"

# находим все файлы с раширением .xib в каталоге xibsPath  
files=`find $xibsPath -name "*.xib" `

for xibFile in $files
do
  # получить имя файла без пути и расширения .xib 
  xibName=`basename $xibFile | awk -F"\." '{print $1}'`
  # задаем имя и путь до файла .nib
  nibFile=$buildPath"/"$xibName".nib"
  # конвертируем xib->nib
  $ibtool $parameters --compile $nibFile $xibFile --sdk $sdkPath
done

Упаковка NIB файлов в IPA
Для упаковки NIB файлы необходимо поместить в ouput-каталог все NIB файлы. Затем в настройках проекта Flash Builder необходимо поставить галочки напротив всех NIB файлов в разделе:
ActionScript Build Packaging -> Apple iOS -> Package Contents



P.S.
Для автоматизации конвертации можно настроить xcode таким образом, что бы sh-скрипт для конвертации XIB->NIB запускался каждый раз когда мы компилируем xcode-приложение нативного расширения. Если в кратце, то необходимо добавить новый Target, добавить Add Build Phase (Run Script) и указать этому Target что перед выполнением необходимо скомпилировать основной Target. Если кому интересно, могу подробно описать данную проедуру.