Qt Framework

Данная инструкция предназначена для связывания (линковки) приложения с вашей версией Qt по условиям лицензии GNU LGPLv3.

Приложение собрано с помощью Qt версии 5.15.5. Исходники можно скачать, например, тут:


iOS

Библиотека (как и приложение) собрана с bitcode с помощью Xcode 13.4.1 со следующими ключами конфигурации:

-opensource -confirm-license -release -strip -static -xplatform macx-ios-clang -appstore-compliant -silent -sdk iphoneos -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtlocation -skip qtlottie -skip qtmultimedia -skip qtnetworkauth -skip qtpurchasing -skip qtquick3d -skip qtquickcontrols -skip qtquicktimeline -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qttools -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebglplugin -skip qtwebsockets -skip qtwebview -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns -make libs -no-compile-examples -no-widgets -no-dbus -system-zlib -no-openssl -no-freetype -no-harfbuzz -no-gif -no-ico -system-sqlite -no-tiff -no-webp

Также использованы патчи для понижения минимальной версии iOS с 12 до 10 (включая активацию 32-битной архитектуры armv7) и рекомендованные патчи от KDE. Файлы патчей находятся тут.

Применение патчей выполняется с помощью следующих команд терминала (приведены команды для оболочки bash/zsh):

# задайте свой путь к склонированному/скачанному
# репозиторию с патчами, это лишь пример

qt5PatchesRepo=~/Downloads/Qt5-iOS-patches
cd путь_к_папке_с_распакованными_исходниками_Qt

cd qtbase
for f in "$qt5PatchesRepo"/5.15.5/kde-patches/* ; do
  patch -p1 < "$f"
done
cd ..

patch -p1 < "$qt5PatchesRepo"/5.15.5/ios10.patch
patch -p1 < "$qt5PatchesRepo"/5.15.5/qmake.patch

После этого можно конфигурировать и собирать Qt.


Получение исполняемого файла приложения

Поскольку Qt собрана в виде статических библиотек, вам необходимо слинковать их с объектными файлами приложения для получения исполняемого файла. Скачайте пакет приложения, а также объектные файлы под нужную архитектуру (для определения архитектуры своего устройства можно воспользоваться страничкой):

  • если у вас версия iOS 11 и выше либо устройство iPhone 5S/iPad Air/iPad Mini 2 и старше: arm64
  • в остальных случаях: armv7

Распакуйте архивы пакета приложения и объектных файлов в одну папку, затем в терминале перейдите в эту папку. Задайте путь к вашему Xcode через команду xcode-select или переменную среды DEVELOPER_DIR и выполните bash/zsh скрипт:

# эти 3 переменные можно менять:
qtDir=~/dev/Qt-libs/5.15.5/ios10-device-xc13.4.1 # путь к вашей Qt для iOS
arch=arm64 # получаемая архитектура, должна совпадать со скачанными объектными файлами
deploymentTarget=10.0 # меняйте только если понимаете что делаете

sdkPath=$(xcrun --sdk iphoneos --show-sdk-path)
$(xcrun -sdk iphoneos --find clang++) \
  $arch/* \
  -dead_strip \
  -fembed-bitcode \
  -fobjc-arc \
  -fobjc-link-runtime \
  -framework AssetsLibrary \
  -framework AudioToolbox \
  -framework CoreFoundation \
  -framework CoreGraphics \
  -framework CoreText \
  -framework Foundation \
  -framework GSS \
  -framework ImageIO \
  -framework Metal \
  -framework MobileCoreServices \
  -framework OpenGLES \
  -framework QuartzCore \
  -framework SafariServices \
  -framework Security \
  -framework StoreKit \
  -framework SystemConfiguration \
  -framework UIKit \
  -framework UserNotifications \
  -isysroot "$sdkPath" \
  -L"$sdkPath/System/Library/Frameworks" \
  -L"$qtDir/lib" \
  -L"$qtDir/plugins"/{bearer,iconengines,imageformats,platforms,qmltooling} \
  -L"$qtDir/qml"/{QtGraphicalEffects,QtGraphicalEffects/private,QtQuick.2} \
  -L"$qtDir/qml/QtQml"{,/Models.2,/WorkerScript.2} \
  -L"$qtDir/qml/QtQuick"/{Layouts,Templates.2,Window.2} \
  -L"$qtDir/qml/QtQuick/Controls.2"{,/Fusion,/Imagine,/Material,/Universal} \
  -lm \
  -lmodelsplugin \
  -lqios \
  -lqjpeg \
  -lqmlplugin \
  -lqqc2materialstyleplugin \
  -lqquicklayoutsplugin \
  -lqsvg \
  -lQt5ClipboardSupport \
  -lQt5Core \
  -lQt5FontDatabaseSupport \
  -lQt5GraphicsSupport \
  -lQt5Gui \
  -lQt5Network \
  -lQt5Qml \
  -lQt5QmlModels \
  -lQt5QmlWorkerScript \
  -lQt5Quick \
  -lQt5QuickControls2 \
  -lQt5QuickTemplates2 \
  -lQt5Svg \
  -lqtgraphicaleffectsplugin \
  -lqtgraphicaleffectsprivate \
  -lqtlibjpeg \
  -lqtlibpng \
  -lqtpcre2 \
  -lqtquick2plugin \
  -lqtquickcontrols2fusionstyleplugin \
  -lqtquickcontrols2imaginestyleplugin \
  -lqtquickcontrols2plugin \
  -lqtquickcontrols2universalstyleplugin \
  -lqtquicktemplates2plugin \
  -lwindowplugin \
  -lworkerscriptplugin \
  -lz \
  -o rachinskii.app/rachinskii \
  -stdlib\=libc++ \
  -target $arch-apple-ios$deploymentTarget \
  -Wl,-e,_qt_main_wrapper \
  -Wl,-rpath,@executable_path/Frameworks \
  -Xlinker -bitcode_hide_symbols \
  -Xlinker -bitcode_symbol_map -Xlinker . \
  -Xlinker -bitcode_verify \
  -Xlinker -no_adhoc_codesign

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


Установка приложения на iOS устройство без Jailbreak

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

  • iOS App Signer — только macOS, требуется Xcode (но раз вы здесь, у вас он явно есть :) )
  • AltStore — Windows и macOS
  • Sideloadly — Windows и macOS

Вам необходимо будет задать Bundle Identifier отличный от ru.etudes.iSchet. Обратите внимание, что вы не сможете установить приложение поверх AppStore версии.