Александр Панюшкин
Александр Панюшкин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) ( ссылка ).

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

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

Комментарии

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

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

  • Результат:50баллов,
  • Очки рейтинга-4
m
  • molni99
  • 26 октября 2024 г. 11:37

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

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

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

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 22:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi1 ноября 2024 г. 0:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 18:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 17:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 21:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
m
moogo22 ноября 2024 г. 18:17
Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
Evgenii Legotckoi
Evgenii Legotckoi25 июня 2024 г. 1:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 ноября 2024 г. 17:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject4 июня 2022 г. 13:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

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