Ця стаття - це записка для себе на тему створення програми для iOS у середовищі QtCreator.
Завдання: зробити програму для iPhone/iPad, яку можна викласти в AppStore. При цьому максимально використовувати інструменти QtCreator і мінімально Xcode.
Що маємо:
- MacBook Pro з macOS Catalina (ver.10.15.2) (підійде будь-який мак, чи працюватиме на віртуалках – не знаю)
- Xcode (ver.11.3) (потрібний обов'язково, без нього нічого не запрацює)
- QtCreator (ver.4.10.2) та Qt 5.12.6 (остання LTS версія на момент написання статті)
- iPhone 7 Plus для тестування працездатності
- Деяка кількість часу, нервів і наполегливості, щоб у всьому розібратися.
Запуск тестової програми
Додаток, для якого я зайнявся питанням встановлення на iOS, працює з картою та геолокацією користувача, тому для цієї статті візьмемо додаток із стандартних прикладів - Places Map (QML) ( посилання . io/qt-5/qtlocation-places-map-example.html)).
Копіюємо приклад (ми будемо вносити в нього невеликі доповнення) і відкриваємо QtCreator.
Вибираємо відповідний кит (симулятором з QtCreator я не користувався):
Конфігураційний файл
І перше, що ми маємо зробити – зібрати проект.
Потім ми переходимо до папки збірки (у моєму випадку це /Users/ap/Downloads/build-places_map-Qt_5_12_6_for_iOS-Debug) беремо звідти файл Info.plist, який переносимо в папку ios, яку створюємо в корені нашого проекту.
Додаємо файл Info.plist до нашого проекту.
Отримуємо таку структуру проекту:
Залишилося додати наш файл до збірки. Для цього в файл *.pro - places_map.pro додаємо наступний код:
ios { QMAKE_INFO_PLIST = ios/Info.plist }
Робимо це додавання тільки для платформи ios.
Тепер при складанні проекту завжди буде використовуватись наш Info.plist.
Версія, компанія, виконуваний файл
Вносимо доповнення до файлу *.pro. Додаємо інформацію про версію, нашу компанію та найменування виконуваного файлу (не плутати назвою, яка відображатиметься для користувача на телефоні).
VERSION = 0.1.1 QMAKE_TARGET_BUNDLE_PREFIX = "ru.mycompany" QMAKE_BUNDLE = "places_map" TARGET = "places_map"
QMAKE_BUNDLE і TARGET вказують на те саме. Я не зрозумів принципових відмінностей між ними. І взагалі вони не є обов'язковими (якщо для вас тільки не принципово, щоб назва файлу, що виконується, відрізнялася від назви проекту).
Версія є обов'язковою. Без версії проект не скомпілюється.
Дані параметри не є платформозалежними.
Мінімальна версія iOS
У файлі *.pro можна також вказати мінімальну версію iOS, на якій буде працювати ваш додаток.
> На жаль, я не знайшов таблички, де було б вказано, з якими версіями працюють компоненти Qt. Логічно було б припустити, що Qt при збиранні сама зможе обчислити мінімальну версію та підставити її, але, на жаль, мені доводилося діяти навмання. Можливо, я просто не знайшов потрібну інформацію і буду радий, якщо мені підкажуть де її шукати.
Для цього додаємо до секції ios *.pro файлу наступний рядок:
QMAKE_IOS_DEPLOYMENT_TARGET =9.0
У наведеному прикладі – мінімальна версія 9.0.
Якщо рядок не вказати, буде підставлена остання на поточний момент версія (на сьогодні це 11).
Найменування програми
> У ряді випадків мені не вдалося знайти способу внесення параметрів тільки .pro файл, довелося прописувати безпосередньо в Info.plist. На мій погляд, це не зовсім правильно, тому я буду вдячний, якщо мені підкажуть, як ці дані можна було внести в .pro і не чіпати Info.plist.
Для зміни назви програми (назви, яку буде бачити користувач iOS), необхідно змінити значення (string) ключа (key) CFBundleDisplayName у файлі Info.plist. Наприклад, так:
<key>CFBundleDisplayName</key> <string>Places Map</string>
Використання геолокацій
Для використання геолокацій, мікрофона, камери тощо. сервісів необхідно у файлі Info.plist вказати про це запит на дозвіл. Робиться це шляхом додавання спеціальних ключів.
У випадку, якщо нам потрібно запитати дозвіл на використання геолокації під час використання програми, ми використовуємо ключ NSLocationWhenInUseUsageDescription. У значенні ключа ми повинні вказати опис, який буде видно користувачеві, в якому потрібно вказати причину, через яку нам потрібний даний сервіс. Без цього опису програму можуть заблокувати на AppStore.
<key>NSLocationWhenInUseUsageDescription</key> <string>This app uses a user's locations to find nearest pizza.</string>
Докладніше про ключі, що використовуються, можна знайти в документації до iOS.
Іконки програми
Важливий етап - створення додатків іконок. Без них ваш додаток не буде додано до AppStore.
Докладно про створення ікон для різних версій описано в інструкції на сайті qt.io - https://doc.qt.io/qt-5/ios-platform-notes.html.
Я зробив все простіше. Нам потрібно буде файл розміром 1024х1024 з нашою іконкою.
Заходимо на сайт https://www.iconsgenerator.com/Home/AppIcons (є й інші, але цей згенерував усі потрібні розміри, чим не змогли похвалитися інші сервіси), закидаємо наш файл та завантажуємо згенеровані іконки.
Отримаємо папку Assets.xcassets (назва не важлива, розширення важлива), в якій будуть наші іконки та json файли з прив'язаними розмірами за типами пристроїв.
Додаємо цю папку до нашого проекту в папку ios.
Потім нам залишилося додати в розділ ios файлу *.pro інформацію про наші іконки:
QMAKE_ASSET_CATALOGS += ios/Assets.xcassets
Завантажувальний екран
Цей крок є обов'язковим, т.к. простий завантажувальний екран із зазначенням найменування вашого виконуваного файлу буде створено під час збирання. Але погодьтеся, з гарною завантажувальною картинкою додаток виглядає краще. Тому створимо свою.
Створимо файл із логотипом. Назвемо його, наприклад, CustomScreenLogo.png . Розмістимо його в папці ios і додамо до проекту.
Тепер потрібно зібрати проект, перейти в папку збірки та знайти файл із розширенням xcodeproj . У нашому випадку це places_map.xcodeproj. Клацаємо по ньому правою кнопкою та переходимо в його вміст. Копіюємо файл LaunchScreen.xib у папку ios нашої програми та перейменовуємо його в CustomScreen.xib .
У назві важливо, щоб розширення було xib, а назві не фігурувало LaunchScreen.
> Варто зазначити, що за інформацією різних сайтах Apple зараз поступово намагається всіх перекладати на Storyboard. Але я все ж таки намагався використовувати варіант з xib файлом, як це запропоновано в документації до Qt.
Додаємо у файл *.pro до розділу ios наступні рядки:
app_launch_screen.files = $$PWD/ios/CustomScreen.xib $$files($$PWD/ios/CustomScreenLogo.png) QMAKE_BUNDLE_DATA += app_launch_screen
А у файлі Info.plist у ключі UILaunchStoryboardName вказуємо CustomScreen (назва нашого xib файлу без розширення).
І наново збираємо проект. І запускаємо файл xcodeproj у Xcode.
У папці BundleData у нас повинні бути наші додані файли:
Відкриваємо файл CustomScreen.xib.
Видаляємо лейбли Label та places_map. Клацаємо на плюсик у верхній правій частині та додаємо до розділу View елемент Image VIew. І в правій частині розділу Image вибираємо наш логотип CustomScreenLogo.png.
Відкриваємо вкладку Size Inspector та вказуємо Autoresizing, щоб наш логотип змінював розмір на різних пристроях.
Варто ще змінити колір фону View.
Потім все зберігаємо, закриваємо Xcode та ще раз збираємо проект у QtCreator.
Перевірка працездатності
Тепер можна запустити проект на вашому пристрої iOS і перевірити його працездатність.
Розповідати про те, як викласти проект у AppStore не буду – він повністю готовий до вивантаження як звичайний проект Xcode, а в мережі досить багато інструкцій, як це зробити. Тільки для розвантаження використовуйте Release складання.
Використані матеріали
Питання, які в мене залишилися
- Як перевірити, що користувач дозволив використання геолокації та інших сервісів? Як запросити дозвіл у процесі роботи програми за необхідності?
-
При складанні вискакує одна помилка -
AppIcon.appiconset/[][ipad][76x76][][][1x][][]:-1: error: notice: 76x76@1x app icons releases of iOS prior to 10.0.
. Її можна уникнути, якщо прописувати іконки безпосередньо в Info.plist, але подібна прописка потім не дає вивантажити програму в AppStore. За ідеєю помилка нічому не заважає, але дратує. Можливо, є спосіб якось її прибрати? - Якось можна встановлювати розмір картинки у статті? А то аж надто великі деякі картинки вийшли.
для последнего Xcode и для последних версий iOS нужно брать Qt 5.14.
по поводу виртуалки - все работает нормально но без сборки на живой айфон у меня не получилось получить бинарник который принимает стор.
согласно последним соглашениям в Info.plist дожны быть обязательно указаны поля NSCameraUsageDescription, NSLocationAlwaysUsageDescription, NSLocationWhenInUseUsageDescription.
после первого создания Info.plist и вносения в него изменений - рекомендую его бекапить, посколько при каждой сборке он будет перезатираться