Создание приложения для iOS в QtCreator

iOS, Qt, appstore

Данная статья - это записка для самого себя на тему создания приложения для 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. По идее ошибка ничему не мешает, но раздражает. Возможно есть способ как-то её убрать?
  • Как-то можно устанавливатьразмер картинки в статье? А то уж больно большие некоторые картинки получились.
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Donate

Hello, Dear Users of EVILEG!!!

If the site helped you, then support the development of the site financially, please.

You can do it by following ways:

Thank you, Evgenii Legotckoi

DK
Jan. 16, 2020, 3:19 a.m.
Dmitrij Korjagin

C++ - Test 001. The first program and data types

  • Result:73points,
  • Rating points1
LZ
Jan. 16, 2020, 3:03 a.m.
Lilija Ziganurova

C++ - Test 005. Structures and Classes

  • Result:50points,
  • Rating points-4
p
Jan. 13, 2020, 4:59 p.m.
popkadurak

C++ - Test 002. Constants

  • Result:100points,
  • Rating points10
Last comments
Jan. 17, 2020, 2:31 a.m.
Andrej Jankovich

Выглядит как ошибка библиотеки. Расскажите подробно на какой платформе вы собираете проект (MinGW или MSVC) их версии и версии Qt.
D
Jan. 16, 2020, 12:06 p.m.
DENIZ1819

Доброго времени суток, не подскажите, что делать в данной ситуации, после того, как я сделал все вышеуказанные инструкции для подключения библиотеки к проекту?
Jan. 14, 2020, 5:33 a.m.
Evgenij Legotskoj

Рекомендую Wt, достаточно мощная вещь. Этот фреймворк может использоваться для написания сайтов на C++, либо можно использовать только отдельный компоненты, например только ORM. Но я не знаю, ка…
a
Jan. 14, 2020, 5:29 a.m.
ayb

Спасибо за инфу. Поиск качественной ORM привел меня только к sqlite_orm, но не подходит из-за необходимости полноценной поддержки c++14. Про framework Wt не слышал, спасибо за наводку.
Jan. 14, 2020, 2:50 a.m.
Evgenij Legotskoj

Вы заблуждаетесь. Любая нормальная ORM позволяет выполнение сырых SQL запросов. А если хорошо разобраться в работе моделей данных в Qt, то не составит труда использовать ORM вместе с Qt, ту же с…
Now discuss on the forum
VZ
Jan. 18, 2020, 7:25 a.m.
Vladimir Zhitkovsky

В приложении есть страницы с контролами. в с++ я заполняю структуры ассоциированные с контролами в qml. затем генерю сигнал о том, что все данные готовы и в qml по этому сигналу заполняю контрол…
Jan. 18, 2020, 7:12 a.m.
Ruslan Polupan

Строку host разкоментировать и указать адрес сервера [listener];host=192.168.0.100port=8080minThreads=4maxThreads=100cleanupInterval=60000readTimeout=60000maxRequestSize=16000maxMulti…
Jan. 17, 2020, 2:20 a.m.
Intruder

Александр, доброго дня! Я тоже только учусь и поэтому мой код может быть не совершенен. За отклик большое спасибо.
L
Jan. 16, 2020, 8:14 p.m.
LesLype

Oct Products Similiar To Lasix Kamagra Now.Co.Uk Sky Pharmacy Canada [url=http://cialibuy.com]Buy Cialis[/url] Viagra Ricetta Ripetibile
Jan. 16, 2020, 6:05 p.m.
Aleksej Vnukov

в лоадер вроде как нельзя передать значение при загрузке, я не нашел такой возможности, через стек без проблем. если использую лоадер - я передаю в С++ нужные параметры, а потом при загрузке стр…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB