Spec-Zone.ru › Qt 5.11

Заметки по платформе — 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>

Это гарантирует, что соответствующие файлы скопированы в нужное место и используются правильные иконки, как требуется в App Store Apple. Распределения 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
}

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

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

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

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

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

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

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

Spec-Zone.ru

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