Александр Панюшкин
Александр Панюшкин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
m
  • molni99
  • 26 жовтня 2024 р. 01:37

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

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

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

  • Результат:20бали,
  • Рейтинг балів-10

C++ - Тест 003. Условия и циклы

  • Результат:42бали,
  • Рейтинг балів-8
Останні коментарі
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr08 лютого 2024 р. 18:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 01:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Тепер обговоріть на форумі
jd
jasmine disouza28 жовтня 2024 р. 04:58
GeForce Now India: Unlocking the Future of Cloud Gaming GeForce Now India has a major impact on the gaming scene by introducing NVIDIA's cloud gaming service to Indian gamers. GeForce Now India lets you stream top-notch PC games on any device, from b…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
J
JacobFib17 жовтня 2024 р. 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
ИМ
Игорь Максимов03 жовтня 2024 р. 04:05
Реализация навигации по разделам Спасибо Евгений!
JW
Jhon Wick01 жовтня 2024 р. 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…

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