Александр Панюшкин
Александр Панюшкин25 декабря 2019 г. 1: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) ( ссылка ).

Копируем пример (мы будем вносить в него небольшие дополнения) и открываем в 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 сборку.

Использованные материалы

Platform Notes - iOS

QMAKE Variable reference

Icon generator

Вопросы, которые у меня остались

  • Как проверить, что пользователь разрешил использование геолокации и иных сервисов? Как запросить разрешение в процессе работы приложения по мере необходимости?
  • При сборке выскакивает одна ошибка -
    AppIcon.appiconset/[][ipad][76x76][][][1x][][]:-1: error: notice: 76x76@1x app icons only apply to iPad apps targeting releases of iOS prior to 10.0.
    . Её можно избежать, если прописывать иконки непосредственно в Info.plist, но подобная пропись затем не даёт выгрузить программу в AppStore. По идее ошибка ничему не мешает, но раздражает. Возможно есть способ как-то её убрать?
  • Как-то можно устанавливатьразмер картинки в статье? А то уж больно большие некоторые картинки получились.
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

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

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Lz

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

  • Результат:70баллов,
  • Очки рейтинга1
РК

Qt - Тест 001. Сигналы и слоты

  • Результат:84баллов,
  • Очки рейтинга4
ВМ

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

  • Результат:80баллов,
  • Очки рейтинга4
Последние комментарии
k
kmssr9 февраля 2024 г. 3:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 10:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 19:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 17:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik19 декабря 2023 г. 6:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
NSProject
NSProject23 июня 2024 г. 21:48
добавить qlineseries в функции А куда собстаенно делся Евгений раз на сайте такой бордак творится?
BlinCT
BlinCT5 мая 2024 г. 13:46
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii Legotckoi2 мая 2024 г. 22:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderChe30 апреля 2024 г. 12:22
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…
G
Gar22 апреля 2024 г. 13:46
Clipboard Как скопировать окно целиком в clipb?

Следите за нами в социальных сетях