Spec-Zone.ru › Qt 5.15

Заметки по платформе - iOS

Развёртывание

Разработка, сборка, выполнение и отладка приложения Qt для iOS могут выполняться с помощью Qt Creator на macOS. Средства разработки предоставляются Xcode от Apple, а запуск qmake для проекта, нацеленного на iOS, также сгенерирует файл проекта Xcode (.xcodeproj) с начальными настройками приложения. Поскольку Qt Creator не предоставляет интерфейс для управления всеми настройками, специфичными для платформы iOS, иногда необходимо настраивать их непосредственно в Xcode. Проверка корректной конфигурации приложения особенно важна перед отправкой приложения в магазин приложений Apple.

Файлы списка свойств информации

Файл списка свойств информации (Info.plist) на iOS и macOS используется для настройки пакета приложения. Эти настройки включают:

  • Имя и идентификатор отображения приложения
  • Необходимые возможности устройства
  • Поддерживаемые ориентации пользовательского интерфейса
  • Иконки и изображения запуска

Подробнее см. документацию по файлу списка свойств информации в библиотеке разработчика iOS.

При запуске qmake генерируется файл Info.plist с соответствующими значениями по умолчанию.

Рекомендуется заменить сгенерированный Info.plist своим собственным, чтобы предотвратить его перезапись при следующем запуске qmake. Можно определить пользовательский список свойств информации с помощью переменной QMAKE_INFO_PLIST в файле .pro.

ios {
    QMAKE_INFO_PLIST = ios/Info.plist
}

Актив приложения

Для файлов, которые не могут быть включены в ресурсы Qt, переменная qmake QMAKE_BUNDLE_DATA предоставляет способ указать набор файлов для копирования в пакет приложения. Например:

ios {
    fontFiles.files = $$files(fonts/*.ttf)
    fontFiles.path = fonts
    QMAKE_BUNDLE_DATA += fontFiles
}

Для изображений ресурсов альтернативный способ — использование каталогов ресурсов в Xcode, которые можно добавить аналогичным образом:

ios {
    QMAKE_ASSET_CATALOGS += ios/Assets.xcassets
}

Иконки

Иконки должны быть установлены в Info.plist и скопированы в пакет приложения. Xcode имеет специальную поддержку иконок, но при использовании Qt обычно лучше задавать их в файле .pro.

Для поддержки всех разрешений и устройств следует создать несколько изображений. Подробный список того, что требуется, доступен по адресу файлы иконок. Имя файла не важно, но важен фактический размер в пикселях. Требуется всего несколько иконок. Однако для поддержки как iPhone, так и iPad требуются следующие изображения:

  • AppIcon29x29.png: 29 x 29
  • AppIcon29x29@2x.png: 58 x 58
  • AppIcon29x29@2x~ipad.png: 58 x 58
  • AppIcon29x29~ipad.png: 29 x 29
  • AppIcon40x40@2x.png: 80 x 80
  • AppIcon40x40@2x~ipad.png: 80 x 80
  • AppIcon40x40~ipad.png: 40 x 40
  • AppIcon50x50@2x~ipad.png: 100 x 100
  • AppIcon50x50~ipad.png: 50 x 50
  • AppIcon57x57.png: 57 x 57
  • AppIcon57x57@2x.png: 114 x 114
  • AppIcon60x60@2x.png: 120 x 120
  • AppIcon72x72@2x~ipad.png: 144 x 144
  • AppIcon72x72~ipad.png: 72 x 72
  • AppIcon76x76@2x~ipad.png: 152 x 152
  • AppIcon76x76~ipad.png: 76 x 76

Эти файлы должны быть скопированы в пакет приложения, добавив в файл .pro что-то вроде следующего фрагмента кода:

ios {
    ios_icon.files = $$files($$PWD/ios/AppIcon*.png)
    QMAKE_BUNDLE_DATA += ios_icon
}

Чтобы использовать иконки, имена файлов также должны быть указаны в Info.plist. Лучший способ — перечислить все файлы иконок, используя ключ CFBundleIconFiles. iPad-специфическую версию можно указать, используя ключ CFBundleIcons~ipad, добавив в Info.plist что-то вроде следующего фрагмента кода:

<key>CFBundleIcons</key>
<dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string>AppIcon29x29.png</string>
            <string>AppIcon29x29@2x.png</string>
            <string>AppIcon40x40@2x.png</string>
            <string>AppIcon57x57.png</string>
            <string>AppIcon57x57@2x.png</string>
            <string>AppIcon60x60@2x.png</string>
        </array>
    </dict>
</dict>
<key>CFBundleIcons~ipad</key>
<dict>
    <key>CFBundlePrimaryIcon</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string>AppIcon29x29.png</string>
            <string>AppIcon29x29@2x.png</string>
            <string>AppIcon40x40@2x.png</string>
            <string>AppIcon57x57.png</string>
            <string>AppIcon57x57@2x.png</string>
            <string>AppIcon60x60@2x.png</string>
            <string>AppIcon29x29~ipad.png</string>
            <string>AppIcon29x29@2x~ipad.png</string>
            <string>AppIcon40x40~ipad.png</string>
            <string>AppIcon40x40@2x~ipad.png</string>
            <string>AppIcon50x50~ipad.png</string>
            <string>AppIcon50x50@2x~ipad.png</string>
            <string>AppIcon72x72~ipad.png</string>
            <string>AppIcon72x72@2x~ipad.png</string>
            <string>AppIcon76x76~ipad.png</string>
            <string>AppIcon76x76@2x~ipad.png</string>
        </array>
    </dict>
</dict>

Это гарантирует, что соответствующие файлы будут скопированы в нужное место, и соответствующие иконки будут использованы в соответствии с требованиями магазина приложений Apple. Распределения ad-hoc также должны включать следующие имена файлов в пакете приложения для визуализации приложения в iTunes:

  • iTunesArtwork 512x512
  • iTunesArtwork@2x 1024x1024

Изображения запуска

Как и иконки, изображения запуска состоят из изображений, которые необходимо скопировать в пакет приложения и ключей, которые необходимо установить в Info.plist.

Для поддержки iPhone 6 должен быть предоставлен файл запуска (файл .xib интерфейса разработчика или файл макета). Дополнительную информацию можно найти на странице Экран запуска. Предполагая, что вы назвали файл запуска Launch.xib, он может быть добавлен в Info.plist следующим образом:

<key>UILaunchStoryboardName</key>
<string>Launch</string>

Можно использовать изображения запуска (файлы PNG), как описано ниже, для поддержки iPhone 6, но это не рекомендуется. Qmake генерирует по умолчанию LaunchScreen.xib, поэтому лучше использовать другое имя для пользовательского экрана запуска, чтобы избежать конфликтов.

Начиная с iOS 7, изображения запуска определяются с помощью ключа UILaunchImages. Для поддержки этих устройств вам необходимо подготовить следующие изображения:

  • LaunchImage-iOS7-568h@2x.png: 640 x 1136
  • LaunchImage-iOS7-Landscape.png: 1024 x 768
  • LaunchImage-iOS7-Landscape@2x.png: 2048 x 1536
  • LaunchImage-iOS7-Portrait.png: 768 x 1024
  • LaunchImage-iOS7-Portrait@2x.png: 1536 x 2048
  • LaunchImage-iOS7@2x.png: 640 x 960

Изображения можно добавить в Info.plist следующим образом:

<key>UILaunchImages</key>
<array>
    <dict>
        <key>UILaunchImageMinimumOSVersion</key>
        <string>7.0</string>
        <key>UILaunchImageName</key>
        <string>LaunchImage-iOS7</string>
        <key>UILaunchImageOrientation</key>
        <string>Portrait</string>
        <key>UILaunchImageSize</key>
        <string>{320, 568}</string>
    </dict>
    <dict>
        <key>UILaunchImageMinimumOSVersion</key>
        <string>7.0</string>
        <key>UILaunchImageName</key>
        <string>LaunchImage-iOS7</string>
        <key>UILaunchImageOrientation</key>
        <string>Portrait</string>
        <key>UILaunchImageSize</key>
        <string>{320, 480}</string>
    </dict>
</array>
<key>UILaunchImages~ipad</key>
<array>
    <dict>
        <key>UILaunchImageMinimumOSVersion</key>
        <string>7.0</string>
        <key>UILaunchImageName</key>
        <string>LaunchImage-iOS7-Landscape</string>
        <key>UILaunchImageOrientation</key>
        <string>Landscape</string>
        <key>UILaunchImageSize</key>
        <string>{768, 1024}</string>
    </dict>
    <dict>
        <key>UILaunchImageMinimumOSVersion</key>
        <string>7.0</string>
        <key>UILaunchImageName</key>
        <string>LaunchImage-iOS7-Portrait</string>
        <key>UILaunchImageOrientation</key>
        <string>Portrait</string>
        <key>UILaunchImageSize</key>
        <string>{768, 1024}</string>
    </dict>
    <dict>
        <key>UILaunchImageMinimumOSVersion</key>
        <string>7.0</string>
        <key>UILaunchImageName</key>
        <string>LaunchImage-iOS7</string>
        <key>UILaunchImageOrientation</key>
        <string>Portrait</string>
        <key>UILaunchImageSize</key>
        <string>{320, 568}</string>
    </dict>
    <dict>
        <key>UILaunchImageMinimumOSVersion</key>
        <string>7.0</string>
        <key>UILaunchImageName</key>
        <string>LaunchImage-iOS7</string>
        <key>UILaunchImageOrientation</key>
        <string>Portrait</string>
        <key>UILaunchImageSize</key>
        <string>{320, 480}</string>
    </dict>
</array>

Для поддержки более ранних версий iOS можно использовать строку UILaunchImageFile в Info.plist:

<key>UILaunchImageFile</key>
<string>LaunchImage</string>

Имя по умолчанию — Default, но qmake генерирует некоторые изображения, поэтому проще использовать другое имя (например, LaunchImage, как мы сделали), чтобы избежать конфликтов.

  • LaunchImage.png: 320 x 480
  • LaunchImage@2x.png: 640 x 960
  • LaunchImage-568h@2x.png: 640 x 1136
  • LaunchImage-Landscape.png: 1024 x 748
  • LaunchImage-Landscape@2x.png: 2048 x 1496
  • LaunchImage-Portrait.png: 768 x 1004
  • LaunchImage-Portrait@2x.png: 1536 x 2008

Можно изменять имена файлов, пока Info.plist и имена файлов остаются синхронизированными.

Наконец, все эти файлы необходимо скопировать в пакет приложения, добавив в файл .pro что-то вроде следующего фрагмента кода:

ios {
    app_launch_images.files = $$PWD/ios/Launch.xib $$files($$PWD/ios/LaunchImage*.png)
    QMAKE_BUNDLE_DATA += app_launch_images
}

Это позволяет создавать универсальные приложения с действительными LaunchImages, как требуется магазином приложений Apple.

Важно: "launch_images" используется в Qt, поэтому он будет перезаписан, если используется в файле .pro.

Родной выборщик изображений

Если файл Info.plist содержит запись для NSPhotoLibraryUsageDescription, qmake автоматически включит дополнительный плагин, который предоставляет доступ к родному выборщику изображений. Если каталог в QFileDialog установлен на:

QStandardPaths::standardLocations(QStandardPaths::PicturesLocation).last();

или, как альтернативу, папка в FileDialog в QML на:

shortcuts.pictures

то отображается родной выборщик изображений, чтобы можно было получить доступ к фотоальбому пользователя.

Выражение поддерживаемых версий iOS

Платформы Apple имеют встроенный способ выражения версий ОС, которые поддерживает приложение, что позволяет более старым версиям платформ автоматически отображать удобное для пользователя сообщение об обновлении ОС вместо аварийного завершения работы и отображения трассировки стека.

Основные понятия, связанные с выражением поддержки определённого диапазона версий ОС:

  • Целевая версия развёртывания указывает минимальную версию macOS, iOS, tvOS или watchOS, поддерживаемую приложением.
  • Версия SDK указывает максимальную версию macOS, iOS, tvOS или watchOS, поддерживаемую приложением.

При разработке приложения для платформы Apple всегда следует использовать последнюю версию Xcode и последнюю доступную SDK на момент разработки. На некоторых платформах, например iOS, вы фактически будете отклонены из магазина приложений, если этого не сделаете. Поэтому версия SDK всегда больше или равна целевой версии развёртывания.

При разработке приложения для платформы Apple необходимо установить целевую версию развёртывания. Различные инструменты сборки в цепочке инструментов Xcode предоставляют флаги, с помощью которых можно установить это значение, включая, но не ограничиваясь, компилятором и компоновщиком. Установив целевую версию развёртывания, вы явно заявляете, что приложение должно работать как минимум с этой версией и не будет работать с более ранними версиями ОС. Затем вы должны убедиться, что ваше использование системных API соответствует тому, что вы объявили. Поскольку компилятор знает, что вы объявили, он может помочь в принудительном обеспечении этого.

Версия SDK рассматривается как максимальная версия ОС, с которой совместимо приложение в том смысле, что если приложение построено с помощью SDK, оно будет продолжать использовать поведение этого SDK даже на более новых версиях ОС, потому что ОС проверяет команды загрузки двоичного файла и эмулирует обратную совместимость со старыми ОС. Например, если приложение построено с SDK macOS 10.12, оно будет продолжать использовать поведение 10.12 даже на 10.13 и выше.

Однако двоичные файлы Mach-O изначально совместимы с будущим. Например, приложение, построенное с SDK iOS 9, будет работать на iOS 10 без проблем, но может не быть включено в любые изменения поведения, которые были внесены в определённые функции на новой версии, до тех пор, пока это приложение не будет перекомпилировано с использованием этого более нового SDK.

Минимальную версию ОС можно выразить системному компилятору и компоновщику с помощью флагов, которые встраивают её в двоичный файл Mach-O. Кроме того, ключ LSMinimumSystemVersion должен быть установлен в пакете приложения. Это значение должно быть равно значению, переданному компилятору и компоновщику, потому что на macOS это позволит ОС отображать дружественное для пользователя диалоговое окно об ошибке, указывающее, что приложение требует более новой версии ОС, вместо диалогового окна об ошибке. LSMinimumSystemVersion также является ключом, который магазин приложений использует для отображения требуемой версии ОС; флаги компилятора и компоновщика там не имеют силы.

В основном приложения Qt будут работать без проблем. Например, в qmake Qt mkspecs устанавливают QMAKE_IOS_DEPLOYMENT_TARGET, QMAKE_MACOSX_DEPLOYMENT_TARGET, QMAKE_TVOS_DEPLOYMENT_TARGET или QMAKE_WATCHOS_DEPLOYMENT_TARGET до минимальной версии, поддерживаемой самим Qt. Аналогично, в Qbs модули Qt устанавливают cpp.minimumIosVersion, cpp.minimumMacosVersion, cpp.minimumTvosVersion, или cpp.minimumWatchosVersion до минимальной версии, поддерживаемой самим Qt.

Однако необходимо быть осторожным при ручном установлении собственной целевой версии. Если вы установите её значение выше, чем требует Qt, и предоставите свой собственный файл Info.plist, вы должны добавить запись LSMinimumSystemVersion в Info.plist, которая соответствует значению целевой версии развёртывания, потому что ОС будет использовать значение LSMinimumSystemVersion в качестве достоверного.

END_OF_DOCUMENT_MARKER

Если вы укажете значение целевой среды развертывания ниже, чем требуется Qt, приложение почти наверняка аварийно завершит работу где-то в библиотеках Qt при запуске на более старой версии, чем поддерживается Qt. Поэтому убедитесь, что код фактической системы сборки отражает минимальную версию ОС, которая фактически требуется.

Публикация в Apple App Store

Проверку готовности вашего приложения Qt для iOS к публикации в App Store можно выполнить, как описано в представлении приложения. Для отправки приложения можно использовать Xcode или Application Loader (установленный с Xcode). Qt Creator не предоставляет интерфейс для управления всеми настройками в конфигурации проекта Xcode.

Приложение должно быть протестировано на версиях iOS и устройствах, которые оно должно поддерживать. Минимальное целевое значение развертывания для приложений Qt варьируется в зависимости от версии Qt. Дополнительную информацию см. в поддерживаемых конфигурациях.

Фактический процесс публикации включает создание сертификата распространения и профиля предоставления, создание подписанного архива вашего приложения и выполнение набора проверочных тестов.

Дополнительную информацию см. в руководстве по распространению приложений в библиотеке разработчика iOS.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/ios-platform-notes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API