Spec-Zone.ru › Qt

Примечания к платформе - iOS

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

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

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

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

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

См. документацию на странице файла списка свойств информации в iOS Developer Library для получения подробностей.

При запуске 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 App Store. Распределения ad-hoc также должны включать в пакет приложения следующие имена файлов для визуализации приложения в iTunes:

  • iTunesArtwork 512x512
  • iTunesArtwork@2x 1024x1024

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

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

Для поддержки iPhone 6 необходимо предоставить файл запуска (файл .xib интерфейсного конструктора или файл storyboard). Дополнительную информацию см. на странице экрана запуска. Предполагая, что вы назвали файл запуска 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
}

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

Важно: "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, вы фактически будете отклонены из App Store, если этого не сделаете. Поэтому версия 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 также используется App Store для отображения требуемой версии ОС; флаги компилятора и компоновщика там не имеют власти.

В основном, приложения 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 как авторитетное.

Если вы укажете значение целевой среды развертывания ниже, чем требуется 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-6.2/ios-platform-notes.html

Spec-Zone.ru

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