Spec-Zone.ru › Qt 5.13

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

Для поддержки iPhone 6 можно использовать изображения запуска (файлы PNG), как описано ниже, но это не рекомендуется. 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 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 даже на более новых версиях ОС, потому что ОС проверяет командные загрузки двоичного файла и эмулирует обратную совместимость со старой ОС. Например, если приложение построено с помощью macOS 10.12 SDK, оно будет продолжать использовать поведение 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-5.13/ios-platform-notes.html

Spec-Zone.ru

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