Александр Панюшкин
Александр Панюшкин24 грудня 2019 р. 14:58

Створення програми для iOS у QtCreator

Ця стаття - це записка для себе на тему створення програми для 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 складання.

Використані матеріали

Примітки щодо платформи – iOS

Довідка про змінну QMAKE

Генератор значків

Питання, які в мене залишилися

  • Як перевірити, що користувач дозволив використання геолокації та інших сервісів? Як запросити дозвіл у процесі роботи програми за необхідності?
  • При складанні вискакує одна помилка -
    AppIcon.appiconset/[][ipad][76x76][][][1x][][]:-1: error: notice: 76x76@1x app icons releases of iOS prior to 10.0.
    . Її можна уникнути, якщо прописувати іконки безпосередньо в Info.plist, але подібна прописка потім не дає вивантажити програму в AppStore. За ідеєю помилка нічому не заважає, але дратує. Можливо, є спосіб якось її прибрати?
  • Якось можна встановлювати розмір картинки у статті? А то аж надто великі деякі картинки вийшли.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Алексей Внуков
  • 26 грудня 2019 р. 05:17

для последнего Xcode и для последних версий iOS нужно брать Qt 5.14.
по поводу виртуалки - все работает нормально но без сборки на живой айфон у меня не получилось получить бинарник который принимает стор.
согласно последним соглашениям в Info.plist дожны быть обязательно указаны поля NSCameraUsageDescription, NSLocationAlwaysUsageDescription, NSLocationWhenInUseUsageDescription.
после первого создания Info.plist и вносения в него изменений - рекомендую его бекапить, посколько при каждой сборке он будет перезатираться

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
d
  • dsfs
  • 26 квітня 2024 р. 11:56

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
d
  • dsfs
  • 26 квітня 2024 р. 11:45

C++ - Тест 002. Константы

  • Результат:50бали,
  • Рейтинг балів-4
d
  • dsfs
  • 26 квітня 2024 р. 11:35

C++ - Тест 001. Первая программа и типы данных

  • Результат:73бали,
  • Рейтинг балів1
Останні коментарі
k
kmssr09 лютого 2024 р. 02:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 09:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 грудня 2023 р. 18:30
Boost - статичне зв&#39;язування в проекті CMake під Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 грудня 2023 р. 16:38
Boost - статичне зв&#39;язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik19 грудня 2023 р. 05:01
Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi02 травня 2024 р. 21:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderChe30 квітня 2024 р. 11:22
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…
G
Gar22 квітня 2024 р. 12:46
Clipboard Как скопировать окно целиком в clipb?
Павел Дорофеев
Павел Дорофеев14 квітня 2024 р. 09:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrex04 квітня 2024 р. 11:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

Слідкуйте за нами в соціальних мережах