From 78b923719cacdb08e468a0ba949d5eaa93187d3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joshua=20Brest=20=28=E6=9D=B0=E6=88=90=29?= <36625023+JoshBashed@users.noreply.github.com> Date: Wed, 9 Sep 2026 02:25:50 -0700 Subject: [PATCH] Add iOS support with build scripts, toolchain, and assets (#302) * feat: add iOS support * ios: clean up icon * ci: add ios build * fix(gui): revert asset lookups to use "%s/assets/%s/%s" for macOS * refactor(gui): remove extra `iconv` linkage for iOS * chore(gitignore): remove unused `xcuserdata` and `DerivedData` entries * fix(gui): use provided `LibXML2` in non-vendored builds * fix(ci): add Xcode setup step for iOS build * fix(pipe): prevent relay threads from using freed stack memory * fix(input): replace bitfields with explicit wire packing for touch and gyro data * fix merge issues * fix cmake merge bug * cmake: attempt iOS SDL fix * older ios * feat: add iOS support * ios: clean up icon * ci: add ios build * refactor(gui): remove extra `iconv` linkage for iOS * chore(gitignore): remove unused `xcuserdata` and `DerivedData` entries * fix(ci): add Xcode setup step for iOS build * cmake: attempt iOS SDL fix * older ios * cleanup * build signed macOS app alongside iOS app * cmake: detect ios version and include liquid glass icon if available * ci: upload continuous release * cmake: move more ios code to toolchain * remove ios simulator target * improvements * remove CMakePresets.json * Update ios-toolchain.cmake * move ios folder to gui folder * converge Info.plist templates * update comments and readme * cmake: remove redundant code * remove redundant ios folder * cmake: add comments to cache strings * cmake/ci: maybe fix new apple builds * cmake: fix new ios build * cmake: fix macOS build? --------- Co-authored-by: MattKC <34096995+itsmattkc@users.noreply.github.com> --- .github/workflows/build.yml | 197 +++++++++++++++++- .gitignore | 4 + CMakeLists.txt | 8 +- README.md | 2 +- cmake/ios-toolchain.cmake | 50 +++++ docker/macos/Dockerfile | 33 --- docker/macos/build.sh | 13 -- docker/macos/toolchain.cmake | 19 -- gui/CMakeLists.txt | 191 +++++++++++++++-- gui/main.c | 19 +- gui/platform.c | 17 +- gui/res/Info.plist.in | 29 +++ gui/res/Vanilla.entitlements | 8 + gui/res/ios/AppIcon.icon/Assets/Vanilla.svg | 4 + gui/res/ios/AppIcon.icon/icon.json | 36 ++++ .../AppIcon.appiconset/Contents.json | 23 ++ .../AppIcon.appiconset/icon-1024.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/icon-120.png | Bin 0 -> 2465 bytes .../AppIcon.appiconset/icon-152.png | Bin 0 -> 3001 bytes .../AppIcon.appiconset/icon-167.png | Bin 0 -> 3140 bytes .../AppIcon.appiconset/icon-180.png | Bin 0 -> 3423 bytes .../AppIcon.appiconset/icon-20.png | Bin 0 -> 693 bytes .../AppIcon.appiconset/icon-29.png | Bin 0 -> 839 bytes .../AppIcon.appiconset/icon-40.png | Bin 0 -> 1060 bytes .../AppIcon.appiconset/icon-58.png | Bin 0 -> 1387 bytes .../AppIcon.appiconset/icon-60.png | Bin 0 -> 1433 bytes .../AppIcon.appiconset/icon-76.png | Bin 0 -> 1680 bytes .../AppIcon.appiconset/icon-80.png | Bin 0 -> 1707 bytes .../AppIcon.appiconset/icon-87.png | Bin 0 -> 1883 bytes gui/res/ios/Assets.xcassets/Contents.json | 3 + gui/res/ios/LaunchScreen.storyboard | 33 +++ 31 files changed, 580 insertions(+), 109 deletions(-) create mode 100644 cmake/ios-toolchain.cmake delete mode 100644 docker/macos/Dockerfile delete mode 100755 docker/macos/build.sh delete mode 100644 docker/macos/toolchain.cmake create mode 100644 gui/res/Info.plist.in create mode 100644 gui/res/Vanilla.entitlements create mode 100644 gui/res/ios/AppIcon.icon/Assets/Vanilla.svg create mode 100644 gui/res/ios/AppIcon.icon/icon.json create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-1024.png create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-120.png create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-152.png create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-167.png create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-180.png create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-20.png create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-29.png create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-40.png create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-58.png create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-60.png create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-76.png create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-80.png create mode 100644 gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-87.png create mode 100644 gui/res/ios/Assets.xcassets/Contents.json create mode 100644 gui/res/ios/LaunchScreen.storyboard diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ea57c49..d58e514 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,6 +10,195 @@ permissions: contents: write packages: write jobs: + build-ios: + name: Build iOS + runs-on: macos-15 + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '16.4' + + - name: Configure iOS + run: | + cmake -S . -B build -G Xcode --toolchain cmake/ios-toolchain.cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 + + - name: Build iOS + run: cmake --build build --config Release --target vanilla + + - name: Create unsigned IPA + run: | + APP=build/bin/Release/Vanilla.app + test -d "$APP" + mkdir -p Payload + cp -R "$APP" Payload/ + zip -9rX vanilla-ios.ipa Payload + + - name: Upload iOS Artifact + uses: actions/upload-artifact@v4 + with: + name: ios + path: vanilla-ios.ipa + + - name: Upload Continuous Release + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'vanilla-wiiu/vanilla' }} + shell: bash + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + curl -fLOSs --retry 2 --retry-delay 60 https://github.com/probonopd/uploadtool/raw/master/upload.sh + bash upload.sh vanilla-ios.ipa + + build-macos: + name: Build macOS + runs-on: macos-15 + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '16.4' + + - name: Configure + run: | + cmake -S . -B build \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \ + -DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ + -DVANILLA_BUILD_PIPE=OFF \ + -DVANILLA_BUILD_VENDORED=ON + + - name: Build + run: cmake --build build --target vanilla + + - name: Package + run: | + ditto -c -k --keepParent "$GITHUB_WORKSPACE/build/bin/Vanilla.app" vanilla-macos-universal-unsigned.zip + + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: macos universal unsigned + path: vanilla-macos-universal-unsigned.zip + if-no-files-found: error + + sign-macos: + name: Sign and notarize macOS + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'vanilla-wiiu/vanilla' }} + needs: build-macos + runs-on: macos-15 + environment: macos-release + steps: + - uses: actions/checkout@v4 + + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '16.4' + + - name: Download unsigned macOS artifact + uses: actions/download-artifact@v4 + with: + name: macos universal unsigned + path: incoming + + - name: Unpack + run: | + mkdir -p signing + ditto -x -k incoming/vanilla-macos-universal-unsigned.zip signing + + - name: Import signing certificate + env: + MACOS_CERTIFICATE_BASE64: ${{ secrets.MACOS_CERTIFICATE_BASE64 }} + MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }} + MACOS_KEYCHAIN_PASSWORD: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + MACOS_NOTARY_KEY_BASE64: ${{ secrets.MACOS_NOTARY_KEY_BASE64 }} + MACOS_NOTARY_KEY_ID: ${{ secrets.MACOS_NOTARY_KEY_ID }} + run: | + certificate_path="$RUNNER_TEMP/developer-id.p12" + keychain_path="$RUNNER_TEMP/vanilla-signing.keychain-db" + notary_key_path="$RUNNER_TEMP/AuthKey_${MACOS_NOTARY_KEY_ID}.p8" + + printf '%s' "$MACOS_CERTIFICATE_BASE64" | base64 --decode -o "$certificate_path" + printf '%s' "$MACOS_NOTARY_KEY_BASE64" | base64 --decode -o "$notary_key_path" + + security create-keychain -p "$MACOS_KEYCHAIN_PASSWORD" "$keychain_path" + security set-keychain-settings -lut 21600 "$keychain_path" + security unlock-keychain -p "$MACOS_KEYCHAIN_PASSWORD" "$keychain_path" + security import "$certificate_path" -P "$MACOS_CERTIFICATE_PASSWORD" -A -t cert -f pkcs12 -k "$keychain_path" + security set-key-partition-list -S apple-tool:,apple: -k "$MACOS_KEYCHAIN_PASSWORD" "$keychain_path" + security list-keychains -d user -s "$keychain_path" + + signing_identity="$(security find-identity -v -p codesigning "$keychain_path" | sed -n 's/.*"\(Developer ID Application:.*\)"/\1/p' | head -n 1)" + + echo "MACOS_NOTARY_KEY_PATH=$notary_key_path" >> "$GITHUB_ENV" + echo "MACOS_SIGNING_IDENTITY=$signing_identity" >> "$GITHUB_ENV" + + - name: Sign + run: | + codesign \ + --force \ + --timestamp \ + --options runtime \ + --entitlements "$GITHUB_WORKSPACE/gui/res/Vanilla.entitlements" \ + --sign "$MACOS_SIGNING_IDENTITY" \ + "$GITHUB_WORKSPACE/signing/Vanilla.app" + codesign --verify --deep --strict --verbose=2 "$GITHUB_WORKSPACE/signing/Vanilla.app" + + - name: Notarize and staple app + env: + MACOS_NOTARY_KEY_ID: ${{ secrets.MACOS_NOTARY_KEY_ID }} + MACOS_NOTARY_ISSUER_ID: ${{ secrets.MACOS_NOTARY_ISSUER_ID }} + run: | + APP="$GITHUB_WORKSPACE/signing/Vanilla.app" + ARCHIVE="$RUNNER_TEMP/Vanilla-notary.zip" + + ditto -c -k --keepParent "$APP" "$ARCHIVE" + xcrun notarytool submit "$ARCHIVE" \ + --key "$MACOS_NOTARY_KEY_PATH" \ + --key-id "$MACOS_NOTARY_KEY_ID" \ + --issuer "$MACOS_NOTARY_ISSUER_ID" \ + --wait + + xcrun stapler staple "$APP" + xcrun stapler validate "$APP" + spctl --assess --type execute --verbose=4 "$APP" + + - name: Package + run: ditto -c -k --keepParent signing/Vanilla.app vanilla-macos-universal.zip + + - name: Remove signing credentials + if: ${{ always() }} + env: + MACOS_NOTARY_KEY_ID: ${{ secrets.MACOS_NOTARY_KEY_ID }} + run: | + security delete-keychain "$RUNNER_TEMP/vanilla-signing.keychain-db" || true + rm -f "$RUNNER_TEMP/developer-id.p12" + if [ -n "$MACOS_NOTARY_KEY_ID" ]; then + rm -f "$RUNNER_TEMP/AuthKey_${MACOS_NOTARY_KEY_ID}.p8" + fi + + - name: Upload signed macOS artifact + uses: actions/upload-artifact@v4 + with: + name: macOS signed and notarized + path: vanilla-macos-universal.zip + if-no-files-found: error + + - name: Upload signed continuous release + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'vanilla-wiiu/vanilla' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + curl -fLOSs --retry 2 --retry-delay 60 https://github.com/probonopd/uploadtool/raw/master/upload.sh + bash upload.sh vanilla-macos-universal.zip + build: strategy: fail-fast: false @@ -27,9 +216,6 @@ jobs: - os: android arch: universal artifact: vanilla-android-universal.apk - - os: macos - arch: universal - artifact: vanilla-macos-universal.zip - os: raspberrypi0w arch: armv6l artifact: vanilla-raspberrypi0w-image.zip @@ -95,8 +281,8 @@ jobs: run: | tar czf ${{ matrix.platform.artifact }} -C "${{ github.workspace }}/build" . - - name: Archive (Windows/macOS/Raspberry Pi/Nintendo Switch) - if: ${{ matrix.platform.os == 'windows' || matrix.platform.os == 'macos' || matrix.platform.os == 'raspberrypi0w' || matrix.platform.os == 'raspberrypi64' || matrix.platform.os == 'nintendoswitch' || matrix.platform.os == 'orangepi_zero3' || matrix.platform.os == 'orangepi_zero2w' }} + - name: Archive (Windows/Raspberry Pi/Nintendo Switch) + if: ${{ matrix.platform.os == 'windows' || matrix.platform.os == 'raspberrypi0w' || matrix.platform.os == 'raspberrypi64' || matrix.platform.os == 'nintendoswitch' || matrix.platform.os == 'orangepi_zero3' || matrix.platform.os == 'orangepi_zero2w' }} run: | cd build zip -r ../${{ matrix.platform.artifact }} . @@ -130,4 +316,3 @@ jobs: run: | curl -fLOSs --retry 2 --retry-delay 60 https://github.com/probonopd/uploadtool/raw/master/upload.sh bash upload.sh ${{ matrix.platform.artifact }} - diff --git a/.gitignore b/.gitignore index cef5039..957ed6d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ build/ +CMakeUserPresets.json .vscode/ .directory .cache/ @@ -12,3 +13,6 @@ buildpi/ .idea/ android/local.properties android/app/src/main/assets + +# macOS +.DS_Store diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f7b49f..449be7b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,13 @@ if(UNIX AND NOT APPLE AND NOT ANDROID) set(LINUX TRUE) endif() -if(ANDROID OR MSVC) +if(APPLE) + # FFmpeg's configure step expects both compiler drivers even though Vanilla + # itself is written in C. + enable_language(CXX) +endif() + +if(ANDROID OR MSVC OR IOS) set(vendored_default TRUE) else() set(vendored_default FALSE) diff --git a/README.md b/README.md index 9272dd3..443c8d5 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ An Arch User Repository (AUR) package called `vanilla-wiiu-git` is available for - [Raspberry Pi](https://github.com/vanilla-wiiu/vanilla/wiki/Single%E2%80%90Board-Computers) (requires [external Wi-Fi adapter](https://github.com/vanilla-wiiu/vanilla/wiki/Linux-Setup-Guide#raspberry-pi)) - [Orange Pi](https://github.com/vanilla-wiiu/vanilla/wiki/Single%E2%80%90Board-Computers) (requires [external Wi-Fi adapter](https://github.com/vanilla-wiiu/vanilla/wiki/Linux-Setup-Guide#raspberry-pi)) - macOS (currently frontend only) -- *iOS* - Coming soon +- [iOS](https://github.com/vanilla-wiiu/vanilla/wiki/iOS) (currently frontend only) ## What Wi-Fi adapter should I use? diff --git a/cmake/ios-toolchain.cmake b/cmake/ios-toolchain.cmake new file mode 100644 index 0000000..ef442c4 --- /dev/null +++ b/cmake/ios-toolchain.cmake @@ -0,0 +1,50 @@ +set(CMAKE_SYSTEM_NAME iOS) + +if(NOT CMAKE_GENERATOR STREQUAL "Xcode") + message(FATAL_ERROR "iOS build requires Xcode generator") +endif() + +set(CMAKE_OSX_SYSROOT iphoneos CACHE STRING "iOS SDK") +set(CMAKE_OSX_ARCHITECTURES arm64 CACHE STRING "iOS architectures") +set(CMAKE_XCODE_GENERATE_SCHEME ON CACHE BOOL "Generate an Xcode scheme") + +# Determine Xcode version to determine iOS deployment target +if(NOT DEFINED CMAKE_OSX_DEPLOYMENT_TARGET) + execute_process( + COMMAND xcodebuild -version + RESULT_VARIABLE _vanilla_xcode_version_result + OUTPUT_VARIABLE _vanilla_xcode_version_output + ERROR_VARIABLE _vanilla_xcode_version_error + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(NOT _vanilla_xcode_version_result EQUAL 0) + message(FATAL_ERROR "Could not determine the selected Xcode version: ${_vanilla_xcode_version_error}") + endif() + + string(REGEX MATCH "Xcode ([0-9]+(\\.[0-9]+)*)" _vanilla_xcode_version_match "${_vanilla_xcode_version_output}") + if(NOT CMAKE_MATCH_1) + message(FATAL_ERROR "Could not parse the selected Xcode version from: ${_vanilla_xcode_version_output}") + endif() + + if(CMAKE_MATCH_1 VERSION_GREATER_EQUAL 26.0) + set(_vanilla_ios_deployment_target 15.0) + else() + set(_vanilla_ios_deployment_target 12.0) + endif() + set(CMAKE_OSX_DEPLOYMENT_TARGET "${_vanilla_ios_deployment_target}" CACHE STRING "Minimum iOS deployment version") +endif() + +if(IS_DIRECTORY "${CMAKE_OSX_SYSROOT}") + set(VANILLA_IOS_SDK_PATH "${CMAKE_OSX_SYSROOT}") +else() + execute_process( + COMMAND xcrun --sdk "${CMAKE_OSX_SYSROOT}" --show-sdk-path + RESULT_VARIABLE _vanilla_ios_sdk_result + OUTPUT_VARIABLE VANILLA_IOS_SDK_PATH + ERROR_VARIABLE _vanilla_ios_sdk_error + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(NOT _vanilla_ios_sdk_result EQUAL 0 OR NOT IS_DIRECTORY "${VANILLA_IOS_SDK_PATH}") + message(FATAL_ERROR "Could not resolve iOS SDK '${CMAKE_OSX_SYSROOT}': ${_vanilla_ios_sdk_error}") + endif() +endif() diff --git a/docker/macos/Dockerfile b/docker/macos/Dockerfile deleted file mode 100644 index ec97a34..0000000 --- a/docker/macos/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM docker.io/ubuntu:24.04@sha256:33ceb71981b602c1a7443a53469e4dba065f7503eab3078a2d7a57a2ab987517 - -ENV DEBIAN_FRONTEND=noninteractive -ENV TZ=Etc/UTC - -RUN apt -y update && \ - apt -y install build-essential git clang patch python3 cmake patch libssl-dev libxml2-dev liblzma-dev cpio libbz2-dev zlib1g-dev bash wget nasm && \ - apt-get clean && \ - apt-get autoremove --yes && \ - rm -rf /var/lib/{apt,dpkg,cache,log}/ - -RUN git clone https://github.com/tpoechtrager/osxcross - -RUN wget -c https://archive.org/download/xcode-clt/Command_Line_Tools_for_Xcode_16.4.dmg - -RUN /osxcross/tools/gen_sdk_package_tools_dmg.sh /Command_Line_Tools_for_Xcode_*.dmg - -RUN rm /Command_Line_Tools_for_Xcode_*.dmg - -RUN mv /osxcross/*.sdk.tar.xz /osxcross/tarballs/ - -RUN SDK_VERSION=14 UNATTENDED=1 /osxcross/build.sh -RUN /osxcross/build_compiler_rt.sh - -# Fix linker in osxcross cmake (https://github.com/tpoechtrager/osxcross/issues/454) -RUN echo 'set(CMAKE_LINKER "${OSXCROSS_TARGET_DIR}/bin/${OSXCROSS_HOST}-ld" CACHE FILEPATH "ld")' >> /osxcross/target/toolchain.cmake -RUN echo 'set(CMAKE_EXE_LINKER_FLAGS "-fuse-ld=${CMAKE_LINKER}")' >> /osxcross/target/toolchain.cmake -RUN echo 'set(CMAKE_SHARED_LINKER_FLAGS "-fuse-ld=${CMAKE_LINKER}")' >> /osxcross/target/toolchain.cmake -RUN echo 'set(CMAKE_MODULE_LINKER_FLAGS "-fuse-ld=${CMAKE_LINKER}")' >> /osxcross/target/toolchain.cmake - -ENV PATH=/osxcross/target/bin:$PATH - -ENTRYPOINT [ "/vanilla/docker/macos/build.sh" ] diff --git a/docker/macos/build.sh b/docker/macos/build.sh deleted file mode 100755 index 154b346..0000000 --- a/docker/macos/build.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -set -e - -cmake \ - -S /vanilla \ - -B /build \ - -DVANILLA_BUILD_VENDORED=ON \ - -DCMAKE_BUILD_TYPE=RelWithDebInfo \ - -DCMAKE_TOOLCHAIN_FILE=/vanilla/docker/macos/toolchain.cmake - -cmake --build /build --parallel -mv /build/bin/*.app /install/ diff --git a/docker/macos/toolchain.cmake b/docker/macos/toolchain.cmake deleted file mode 100644 index 1bcd371..0000000 --- a/docker/macos/toolchain.cmake +++ /dev/null @@ -1,19 +0,0 @@ -set(CMAKE_CROSSCOMPILING ON) - -set(CMAKE_SYSTEM_NAME "Darwin") - -set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13") -set(CMAKE_OSX_SYSROOT "/osxcross/target/SDK/MacOSX14.sdk") -set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64") - -set(CMAKE_INSTALL_NAME_TOOL "xcrun install_name_tool") -set(CMAKE_C_COMPILER clang) -set(CMAKE_CXX_COMPILER clang) -execute_process(COMMAND xcrun -find ar OUTPUT_VARIABLE CMAKE_AR OUTPUT_STRIP_TRAILING_WHITESPACE) -execute_process(COMMAND xcrun -find nm OUTPUT_VARIABLE CMAKE_NM OUTPUT_STRIP_TRAILING_WHITESPACE) -execute_process(COMMAND xcrun -find ranlib OUTPUT_VARIABLE CMAKE_RANLIB OUTPUT_STRIP_TRAILING_WHITESPACE) -execute_process(COMMAND xcrun -find strip OUTPUT_VARIABLE CMAKE_STRIP OUTPUT_STRIP_TRAILING_WHITESPACE) - -execute_process(COMMAND xcrun -find ld OUTPUT_VARIABLE CMAKE_LINKER OUTPUT_STRIP_TRAILING_WHITESPACE) -set(CMAKE_C_FLAGS "--target=darwin -fuse-ld=${CMAKE_LINKER}") -set(CMAKE_CXX_FLAGS "--target=darwin -fuse-ld=${CMAKE_LINKER}") diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 199b844..27fee24 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -69,6 +69,27 @@ function(compile_ffmpeg _target_name _system_name _system_processor) ) elseif(MSVC) set(FFMPEG_TARGET_OS "win32") + elseif(IOS) + set(FFMPEG_TARGET_OS "darwin") + set(_ios_version_flag "-mios-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") + set(FFMPEG_LDFLAGS "${CMAKE_C_FLAGS} -arch ${_system_processor} ${_ios_version_flag} -isysroot ${VANILLA_IOS_SDK_PATH}") + set(FFMPEG_CFLAGS "${CMAKE_C_FLAGS} -arch ${_system_processor} ${_ios_version_flag} -isysroot ${VANILLA_IOS_SDK_PATH} -w") + list(APPEND FFMPEG_CONFIGURE_ARGS + --disable-asm + --disable-avdevice + --disable-indevs + --disable-outdevs + --nm=${CMAKE_NM} + --ar=${CMAKE_AR} + --ranlib=${CMAKE_RANLIB} + --cc=${CMAKE_C_COMPILER} + --cxx=${CMAKE_CXX_COMPILER} + --ld=${CMAKE_C_COMPILER} + --strip=${CMAKE_STRIP} + --host-cc=clang + --host-ld=clang + --enable-videotoolbox + ) elseif(APPLE) set(FFMPEG_TARGET_OS "darwin") set(FFMPEG_LDFLAGS "${FFMPEG_LDFLAGS} -arch ${_system_processor} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET} -L${CMAKE_OSX_SYSROOT}/usr/lib -lSystem") @@ -220,16 +241,23 @@ if (VANILLA_BUILD_VENDORED) set(LIBXML2_WITH_ICONV OFF) set(LIBXML2_WITH_PROGRAMS OFF) set(LIBXML2_WITH_TESTS OFF) - FetchContent_Declare( - libxml2 - GIT_REPOSITORY https://gitlab.gnome.org/GNOME/libxml2.git - GIT_TAG v2.13.5 - EXCLUDE_FROM_ALL - ) - FetchContent_MakeAvailable(SDL2 SDL2_ttf SDL2_image libxml2) + if (NOT IOS) + FetchContent_Declare( + libxml2 + GIT_REPOSITORY https://gitlab.gnome.org/GNOME/libxml2.git + GIT_TAG v2.13.5 + EXCLUDE_FROM_ALL + ) + FetchContent_MakeAvailable(SDL2 SDL2_ttf SDL2_image libxml2) + else() + FetchContent_MakeAvailable(SDL2 SDL2_ttf SDL2_image) + endif() - if (APPLE) + if (IOS) + # Compile FFmpeg for arm64 + compile_ffmpeg("FFmpeg" "${CMAKE_SYSTEM_NAME}" "${CMAKE_OSX_ARCHITECTURES}") + elseif (APPLE) # Compile FFmpeg for both x86_64 and arm64 foreach (_arch ${CMAKE_OSX_ARCHITECTURES}) compile_ffmpeg("FFmpeg_${_arch}" "${CMAKE_SYSTEM_NAME}" "${_arch}") @@ -359,10 +387,105 @@ if (VANILLA_BUILD_USE_POLKIT) ) endif() +if(APPLE) + if(IOS) + set(VANILLA_PLATFORM_INFO_PLIST_ENTRIES [=[ + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + arm64 + wifi + + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIStatusBarHidden + + UIViewControllerBasedStatusBarAppearance + + UIRequiresFullScreen + ]=]) + else() + set(VANILLA_PLATFORM_INFO_PLIST_ENTRIES [=[ + LSMinimumSystemVersion + ${CMAKE_OSX_DEPLOYMENT_TARGET} + NSHighResolutionCapable + ]=]) + endif() + + configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/res/Info.plist.in" + "${CMAKE_CURRENT_BINARY_DIR}/Vanilla.Info.plist.in" + @ONLY + ) +endif() + # Declare executable add_library(vanillagui STATIC ${VANILLA_GUI_SRC}) if (ANDROID) add_library(vanilla SHARED main.c) +elseif(IOS) + add_executable(vanilla MACOSX_BUNDLE + main.c + ) + set_target_properties(vanilla PROPERTIES + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.mattkc.vanilla" + XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2" + XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "${CMAKE_OSX_DEPLOYMENT_TARGET}" + ) + + set_target_properties(vanilla PROPERTIES + XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO" + ) + + # Compile storyboard + add_custom_command( + TARGET vanilla POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory "$/LaunchScreen.storyboardc" + COMMAND xcrun ibtool --compile "$/LaunchScreen.storyboardc" + "${CMAKE_CURRENT_SOURCE_DIR}/res/ios/LaunchScreen.storyboard" + --target-device iphone --target-device ipad + --minimum-deployment-target "${CMAKE_OSX_DEPLOYMENT_TARGET}" + VERBATIM + ) + + # Compile app icon with actool + if(XCODE_VERSION VERSION_GREATER_EQUAL 26.0 + AND CMAKE_OSX_DEPLOYMENT_TARGET VERSION_GREATER_EQUAL 15.0) + set(_vanilla_icon_input "${CMAKE_CURRENT_SOURCE_DIR}/res/ios/AppIcon.icon") + set(_vanilla_icon_extra_args --include-all-app-icons) + else() + set(_vanilla_icon_input "${CMAKE_CURRENT_SOURCE_DIR}/res/ios/Assets.xcassets") + set(_vanilla_icon_extra_args) + endif() + + add_custom_command( + TARGET vanilla POST_BUILD + COMMAND xcrun actool + --compile "$" + --enable-on-demand-resources NO + --app-icon AppIcon + --platform iphoneos + ${_vanilla_icon_extra_args} + --minimum-deployment-target "${CMAKE_OSX_DEPLOYMENT_TARGET}" + --target-device iphone --target-device ipad + --output-partial-info-plist "${CMAKE_CURRENT_BINARY_DIR}/AssetCatalog-Info.plist" + "${_vanilla_icon_input}" + COMMAND /usr/libexec/PlistBuddy -x + -c "Merge ${CMAKE_CURRENT_BINARY_DIR}/AssetCatalog-Info.plist" + "$/Info.plist" + VERBATIM + ) else() add_executable(vanilla MACOSX_BUNDLE main.c) endif() @@ -377,6 +500,11 @@ if (APPLE) # Set bundle name to be more user-friendly set_target_properties(vanilla PROPERTIES OUTPUT_NAME Vanilla + MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_BINARY_DIR}/Vanilla.Info.plist.in" + MACOSX_BUNDLE_GUI_IDENTIFIER "com.mattkc.vanilla" + MACOSX_BUNDLE_BUNDLE_NAME "Vanilla" + MACOSX_BUNDLE_SHORT_VERSION_STRING "1.0" + MACOSX_BUNDLE_BUNDLE_VERSION "1" ) else() # Ensure executable is installed @@ -391,7 +519,6 @@ if (NOT VANILLA_BUILD_VENDORED) endif() target_link_libraries(vanillagui PRIVATE - SDL2::SDL2main ${_sdl_lib} SDL2_ttf SDL2_image @@ -401,7 +528,6 @@ target_link_libraries(vanillagui PRIVATE if (ANDROID) target_link_libraries(vanillagui PRIVATE - SDL2main android GLESv2 log @@ -409,6 +535,9 @@ if (ANDROID) ) endif() +# SDL owns the platform entry-point shim used by main.c. +target_link_libraries(vanilla PRIVATE SDL2::SDL2main ${_sdl_lib}) + # Find FFmpeg if (NOT VANILLA_BUILD_VENDORED) find_package(FFmpeg REQUIRED COMPONENTS avformat avcodec avutil swscale) @@ -431,7 +560,24 @@ if (LINUX) endif() if (APPLE) - target_link_libraries(vanillagui PRIVATE "-framework VideoToolbox" "-framework CoreMedia" iconv) + target_compile_definitions(vanillagui PRIVATE VANILLA_VIDEOTOOLBOX_AVAILABLE) + target_link_libraries(vanillagui PRIVATE + "-framework CoreFoundation" + "-framework CoreMedia" + "-framework CoreVideo" + "-framework Foundation" + "-framework Metal" + "-framework QuartzCore" + "-framework VideoToolbox" + iconv + ) +endif() + +if (IOS) + target_link_libraries(vanillagui PRIVATE + "-framework ImageIO" + "-framework MobileCoreServices" + ) endif() if (VANILLA_BUILD_PIPE) @@ -484,7 +630,12 @@ endif() # Find libxml2 (used for storing/parsing user config) if (VANILLA_BUILD_VENDORED) - target_link_libraries(vanillagui PRIVATE LibXml2::LibXml2) + if (IOS) + target_link_libraries(vanillagui PRIVATE "-lxml2") + target_include_directories(vanillagui PRIVATE "${VANILLA_IOS_SDK_PATH}/usr/include/libxml2") + else() + target_link_libraries(vanillagui PRIVATE LibXml2::LibXml2) + endif() else() find_package(LibXML2 REQUIRED) target_link_libraries(vanillagui PRIVATE ${LibXML2_LIBRARIES}) @@ -506,8 +657,20 @@ target_include_directories(vanillagui PRIVATE ) # Install assets -if(APPLE) - # Put assets in correct place relative to build +if(ANDROID) + # Put assets in correct place relative to build + add_custom_command( + TARGET vanilla POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/assets" "${CMAKE_CURRENT_SOURCE_DIR}/../android/app/src/main/assets" + ) +elseif(IOS) + # Put assets inside the iOS app bundle + add_custom_command( + TARGET vanilla POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/assets" "$/assets" + ) +elseif(APPLE) + # Put assets in correct place relative to build add_custom_command( TARGET vanilla POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different "${CMAKE_CURRENT_SOURCE_DIR}/assets" "$/../Resources/assets" diff --git a/gui/main.c b/gui/main.c index 83fffbe..1571225 100644 --- a/gui/main.c +++ b/gui/main.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -9,18 +10,22 @@ #include "ui/ui.h" #include "ui/ui_sdl.h" +#if defined(__APPLE__) +#include +#if TARGET_OS_IOS +// SDL_main will be linked incorrectly on iOS unless we include this +#include +#endif +#endif + #define SCREEN_WIDTH 854 #define SCREEN_HEIGHT 480 -#if !defined(ANDROID) && !defined(_WIN32) -#define SDL_main main -#endif - #include "pipemgmt.h" -void display_cli_help(const char **argv); +void display_cli_help(char **argv); -int SDL_main(int argc, const char **argv) +int main(int argc, char **argv) { int ret = 1; @@ -126,7 +131,7 @@ exit_config: return ret; } -void display_cli_help(const char **argv) { +void display_cli_help(char **argv) { vpilog("Usage: %s [options]\n\n", argv[0]); vpilog("Options:\n"); vpilog(" -w, --window Run Vanilla in a window (overrides config)\n"); diff --git a/gui/platform.c b/gui/platform.c index 1a96945..2c6f483 100644 --- a/gui/platform.c +++ b/gui/platform.c @@ -1,12 +1,7 @@ #include "platform.h" -#if defined(ANDROID) -#include -#elif defined(_WIN32) -#include -#endif - #include +#include #include #include "ui/ui_util.h" @@ -34,15 +29,7 @@ void vpi_get_data_filename(char *out, size_t out_size, const char *filename, con void vpilog_va(const char *fmt, va_list va) { -#if defined(ANDROID) - __android_log_vprint(ANDROID_LOG_ERROR, "VPI", fmt, va); -// #elif defined(_WIN32) -// char buf[4096]; -// vsnprintf(buf, sizeof(buf), fmt, va); -// MessageBoxA(0, buf, 0, 0); -#else - vfprintf(stderr, fmt, va); -#endif + SDL_LogMessageV(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, fmt, va); } void vpilog(const char *fmt, ...) diff --git a/gui/res/Info.plist.in b/gui/res/Info.plist.in new file mode 100644 index 0000000..31dbb54 --- /dev/null +++ b/gui/res/Info.plist.in @@ -0,0 +1,29 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleIdentifier + ${MACOSX_BUNDLE_GUI_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + CFBundleVersion + ${MACOSX_BUNDLE_BUNDLE_VERSION} +@VANILLA_PLATFORM_INFO_PLIST_ENTRIES@ + NSLocalNetworkUsageDescription + Vanilla needs local network access to connect to your Wii U. + NSMicrophoneUsageDescription + Vanilla needs microphone access to stream audio to your Wii U. + + diff --git a/gui/res/Vanilla.entitlements b/gui/res/Vanilla.entitlements new file mode 100644 index 0000000..d459cb2 --- /dev/null +++ b/gui/res/Vanilla.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.device.audio-input + + + diff --git a/gui/res/ios/AppIcon.icon/Assets/Vanilla.svg b/gui/res/ios/AppIcon.icon/Assets/Vanilla.svg new file mode 100644 index 0000000..d996a31 --- /dev/null +++ b/gui/res/ios/AppIcon.icon/Assets/Vanilla.svg @@ -0,0 +1,4 @@ + + + + diff --git a/gui/res/ios/AppIcon.icon/icon.json b/gui/res/ios/AppIcon.icon/icon.json new file mode 100644 index 0000000..58b780b --- /dev/null +++ b/gui/res/ios/AppIcon.icon/icon.json @@ -0,0 +1,36 @@ +{ + "fill": { + "automatic-gradient": "srgb:0.13333,0.79608,1.00000,1.00000" + }, + "groups": [ + { + "layers": [ + { + "image-name": "Vanilla.svg", + "name": "Vanilla", + "position": { + "scale": 34.5, + "translation-in-points": [ + 0, + 0 + ] + } + } + ], + "shadow": { + "kind": "neutral", + "opacity": 0.5 + }, + "translucency": { + "enabled": true, + "value": 0.5 + } + } + ], + "supported-platforms": { + "circles": [ + "watchOS" + ], + "squares": "shared" + } +} diff --git a/gui/res/ios/Assets.xcassets/AppIcon.appiconset/Contents.json b/gui/res/ios/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..089dc45 --- /dev/null +++ b/gui/res/ios/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { "idiom" : "iphone", "size" : "20x20", "scale" : "2x", "filename" : "icon-40.png" }, + { "idiom" : "iphone", "size" : "20x20", "scale" : "3x", "filename" : "icon-60.png" }, + { "idiom" : "iphone", "size" : "29x29", "scale" : "2x", "filename" : "icon-58.png" }, + { "idiom" : "iphone", "size" : "29x29", "scale" : "3x", "filename" : "icon-87.png" }, + { "idiom" : "iphone", "size" : "40x40", "scale" : "2x", "filename" : "icon-80.png" }, + { "idiom" : "iphone", "size" : "40x40", "scale" : "3x", "filename" : "icon-120.png" }, + { "idiom" : "iphone", "size" : "60x60", "scale" : "2x", "filename" : "icon-120.png" }, + { "idiom" : "iphone", "size" : "60x60", "scale" : "3x", "filename" : "icon-180.png" }, + { "idiom" : "ipad", "size" : "20x20", "scale" : "1x", "filename" : "icon-20.png" }, + { "idiom" : "ipad", "size" : "20x20", "scale" : "2x", "filename" : "icon-40.png" }, + { "idiom" : "ipad", "size" : "29x29", "scale" : "1x", "filename" : "icon-29.png" }, + { "idiom" : "ipad", "size" : "29x29", "scale" : "2x", "filename" : "icon-58.png" }, + { "idiom" : "ipad", "size" : "40x40", "scale" : "1x", "filename" : "icon-40.png" }, + { "idiom" : "ipad", "size" : "40x40", "scale" : "2x", "filename" : "icon-80.png" }, + { "idiom" : "ipad", "size" : "76x76", "scale" : "1x", "filename" : "icon-76.png" }, + { "idiom" : "ipad", "size" : "76x76", "scale" : "2x", "filename" : "icon-152.png" }, + { "idiom" : "ipad", "size" : "83.5x83.5", "scale" : "2x", "filename" : "icon-167.png" }, + { "idiom" : "ios-marketing", "size" : "1024x1024", "scale" : "1x", "filename" : "icon-1024.png" } + ], + "info" : { "version" : 1, "author" : "xcode" } +} diff --git a/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..d36f3ee98e44c97e312e34e00cf58df00dc66d6b GIT binary patch literal 14142 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 Xw@7d^5(;7-Fo31mS!An;N7CN_gm`Sq literal 0 HcmV?d00001 diff --git a/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-152.png b/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-152.png new file mode 100644 index 0000000000000000000000000000000000000000..385f5e78b8157604cc0a10d62223c081e2145881 GIT binary patch literal 3001 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 SA?=)xEx;b`1fyB|B>W94!DUMT literal 0 HcmV?d00001 diff --git a/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-167.png b/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-167.png new file mode 100644 index 0000000000000000000000000000000000000000..3c40d766b7b34ee2f6a384cd226d7ec1b29ad77c GIT binary patch literal 3140 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 literal 0 HcmV?d00001 diff --git a/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-20.png b/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-20.png new file mode 100644 index 0000000000000000000000000000000000000000..093137bd0c365daed68e589945754ab447d658a5 GIT binary patch literal 693 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjyg=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G(@^*J&P+~aE@c+}UKy#o7dx@v7EBh;UHa0c6 zi!zsMfkLV!t`Q|Ei6yC4$wjF^iowXh$V}J3T-U%X#K6qT*uu)dK-<6oNcsw?e?`%d zo1c=IR*74KjsJX4pau=N4JDbmsl_FUxdoVdjG>l1y}GlMfq`+Vr;B5V#p$C{_WCIs z3LLM0d^cxPi}LC4?gox7WM`%ZZ*;FPrLV@BP#ia+wFU#xt%d6}JWouVC zHE%-cij24{hJDU%fqfjjwtQSZ(mDc?Hb=iHl!x}sn|aFUGH*fHqfKX=_?lqCpZKkDu5^*!M9%}aCWQH~SwyO8VF@{#D9N5usCg$y}9>JM-q;lr`*oq|YSue7lRWi((&S_frc;yni(2X8q#XnA6 z%NOzu`mo5dCQGpMh;rogbj?Tc%32rh2G09hEW)DqKBDF)AFuI^(=`|Ny*I94E}2)S V>-;tJF)&gYJYD@<);T3K0RSJV1Tg>r literal 0 HcmV?d00001 diff --git a/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-29.png b/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-29.png new file mode 100644 index 0000000000000000000000000000000000000000..97d027e4e63420e9880d1d633995cb61b38fe6c1 GIT binary patch literal 839 zcmeAS@N?(olHy`uVBq!ia0vp^vLMXC1SD^M{15@86p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!tD$=lt9L5bls!~aja0?mOU>?NMQuI#Va+1S+N zF3Mc41q!K_xJHzuB$lLFB^RXvDF!10BQsqCb6o?o5CbzSV+$(-18oBXAn7Zl{uM<- zZhlH;S|x4`HvaQHff_X6Hk4%MrWThZ<`!V;F@{?5^y_okqZ1dC zqSOIbokzR7-`-xjgXQ->31>k?#@lz_oGHKm=1h(9_4r7=hbvAq{O$j(Ucf5j=&rWOO_Umq|{@1^=hV|IA<=J;WGj5Z%`G01*;c>y$qG8$$#|4iSolV{C zxFB-nhBqHR=uXv1HRZNqyua`*;~Yt*v$FEs?aqB|4DQZ+?GZa(3um0;akzcBd`3#V z{eM0&HL(MN4eX{d4^0xkvm|_Pxy%xNV~u~Unwa-L*;Bt61DH0vyZp&u+Fr&3_ZX5h zE7!!&WSjo&@ST66Ga_OZN+&#UKGSXYKAES4IVLgbxx+u1>u~}1Ry?$BX;Yuy!L#qM zTkfn2`Hz>Ci`|mjKCP2C(J5!gUZ2~Cb!J^*EuIt6a8~NC;eDZB$?vW+oKd=X&GmAQ zN7TnWhxI2Bz~7rS@V=HH3yg>h9X+s%VJ zJ9t8m9%|JRkhW=!zOcFGZjkDl7e__?{X>&;IGaD!dDK;YKmYj;_qW^joxf$T?c9BO U3-A5Cz+}eY>FVdQ&MBb@0MeFFXaE2J literal 0 HcmV?d00001 diff --git a/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-40.png b/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-40.png new file mode 100644 index 0000000000000000000000000000000000000000..c6265158c49bf441fbaee0b0e8ff47ccb21f331e GIT binary patch literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1SFZ~=vx6Pg=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G(@^*J&P+~aE@c+}UKy#o7dx@v7EBh;UHa0c6 zi!zsMfkLV!t`Q|Ei6yC4$wjF^iowXh$V}J3T-U%X#K6qT*uu)dK-<6oNcsw?e?`%d zo1c=IR*74KjsJX4pau=N4JDbmsl_FUxdoVdjG>l1y}Gj$=vfv|7srr@!*8eiW(zw? z9IrRteDm%M@#L^04JHBpRWAYq_?vEYha9Y7c>kze;EQ!fdHDA<=rS>I&s(4o8=Tc?$|U6N zDcJGR{4C3~3&wLecidhe$#CcPgV^~2Mh18Ci}rcsFmz2SJJZa|0#U?f1H;H~sXzqHnnr%mj?CtHvnC z+xfS_Z!)Kx;CtoRoA!DOe}I4p3)?hjy|5Pr- z_}1jcod@%?Tz@ce&Yco28(02fiN^=lwHbQ;!P?iCxXr9wc*v{stDfl5$+-<(N#UD= z9yz7vlpRr))15cFG|Aa>5ymSH&>c(4sE_lw; zyitcWW}T4q_K4)ePqn-mkDZ&Y|5^3A#6)9-Y(NaN>97WP>ev&wny6own)F{O>QA^P+pX>YYmEa`dLY+FVdQ&MBb@0MLlD0ssI2 literal 0 HcmV?d00001 diff --git a/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-58.png b/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-58.png new file mode 100644 index 0000000000000000000000000000000000000000..72414562f6190c8fe5565d820a74d4c1088446fb GIT binary patch literal 1387 zcmeAS@N?(olHy`uVBq!ia0vp^Rv^s51SIor-mM2x3dtTpz6=aiY77hwEes65fIH=O_E+p|Y-(~B zWiHnOg;YyiBT7;dOH!?pi&B9UgOP!enXZAku7O#Ifti)Dg_VJUwt)eV^c7P7ilQMm zKP5A*61N5$|M{Lk4H|G8N-}d(i%Sx73o!K=F7NB zw9hXuJO4fL{!cre&dw$a%Dhl}rR-WsSeG%kHn_?m~cwe>1r{QskW)h64iF&5gaQ_o@9 z^WA9v86KPeg_Cb*htzCQRbEqCx%q^4a&`Cri-~K!-8MYn^gZh|wLHE{=HC2g&7%8$ zO!l<5J7(zY%gKAT=H$jQ-CLJ7GI$49?4ApB;=UTT4apb8a&Hn2nF)P@zSCj2c4QE3O4K){{+Pa9Yh z3Yz~WcC+hpaWQ*kNUsb1klLWL=9^F7p04Tni}qx**Uj;0D9@T=!}L1p?xj0xcl)*R z-e0+Sscb-kW@XHJ*Q4y&{rtH>F_tT4G~Tp%-fd#)WiV|`(T;@@4ZB~bIID8_p8ct` zx$=y_uil&pfTXqP9NZP}+2PvyB@h3yOG>Gqay@oteH! z>3FlZK4bjqPp^fK+4iK~dA!a4=6yCWTO)C(uz0WAP4x|a{QR^2Tr2V7 z&`F)&n)Re+&5nczIepx&)7f=?G~JKBoRg_1VmVt{>uw*<^fvMAWqzW~ zbNk{Wyzw8WaxLHdW`>48=Nk#X^qn>(yJS`KW;CeV>P^p-Hfj=@GC}ZGn|7+&-o(pq zH44jfce-5%mI)^UIJR$lGf?2F%QFIalJUiHnxQ{N7(JYXN`Q*!v~ z$>*zeLhkO%+H%~EZTsinIak+CPC6tWJU8{wb}3) zbJF<+uNxc{w&x#-T$bE!EpbUlqvF=n*`{(^HC3&}JX^RcoNiyZwD{z=zZY2h_ei~5 zD7-+|a^VC|le)>#6-%a1_$siYWjXutzkh$QTHp6A489{`eiTL})ib*$Pfy)_e8xIp PQN-Zs>gTe~DWM4f_*Pvs literal 0 HcmV?d00001 diff --git a/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-60.png b/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-60.png new file mode 100644 index 0000000000000000000000000000000000000000..2a34d49d8d99fb68ac930bfecdf1c36a2b07e22e GIT binary patch literal 1433 zcmZ{keKgYx7{`CcHYQ{8wwT)$VW>rCW*Fvm$xGhfx=q6BwwTt7cV)ZfvMHrV(UOd< z@|xEc(H)x@>gq)oH!sT_Q6cSCcb#+3J?EZ#?jO(h`#s-tKIeJ3ajeos?mvS z4v;29$Quio1$$Bym>s63o2n6`8-P)sP^TCBxM`IjJnCwmj}jdpidCVjI!h|bJjBYj zK}ZX;$o;8V8dV1su{ctfrw2Bv`aOtNr-cp}t6w_hev$2{+q8v$+#z^Me&1*nVX-NT z_x|a=ezIXiqtWvEn@T_YafVgldZQb;4q%81p$?G=k8dosK5DME<_FP&X@&6Kl8^b3 zM~r7LXbU(L!2gnio}|g3E^y~~(z}~}-JNO92j5>O4U@ZF#VOX42awk(OB&|8#+?SL zBEvdxwnY@3CRd^D+;Y#EepO2gy6&XN`VTCEXSLHLYcE6!@A&-gv=_q)@QP@OsnKX- z!jdyxjvAxHJ~D*FixTA@&TXUX254z%OMDxjI1xR&(BPhH#nVdrTMRx7!oazqD#ZB9 z!m2|fCuOs0d#h$?wZu_4Q-<}9D!x)St{K)S5`e13J5376-S&!$xnMGBTF!lxtCz*s z;2>zV0|L-__zKEiAoesLYl3GSiJ~|Ey8Rf#t9L;c;E`Y*&BQJ9R-sdesNzK#Wl~3y zRBH*$9Zw-csV~EQHZ1sn($d@RvhK}H!Uq>*;S&jCFYh1&v;4W!a_l)Sko z+M*LV<<|Zxc+pkiqeBlw9SnB3OGhFun1eJwY?jp?=6u~Q*HmRz!=SoL RLyE@*kUaf8?hwhR{{nM3ag6`~ literal 0 HcmV?d00001 diff --git a/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-76.png b/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..a6be856969a2f183add40f928fff055147116a09 GIT binary patch literal 1680 zcmZ{kc~H{_7RP@^Ihqz*3Md4U1q-p!peaNo0a`i3(U6dUu@J(Q#Gqh+gi{WQ3Q9R* zRUiZcElof~NrV-Fh)B4yU==Bq8PyeBXTL&AdO}RiZCW z4-5eV0HEjP=|wlLnNYg#nyHYhUkMJbn0U!kq02eL+z&lNJVFm!=Q2;O(3INz* z0N5W>+U)138EA+5;M{-%KriseO0(Z_O`^l~!n^Ct>1b=iVf|(UX`0B2>wbz$592bh z5pfI+02`Ezoi*yXHOkH(Wrwx3$D&Y&Q7BEve|m8JFG4h%9?4Apd%=-V?xhhv|L+EF zWHf`r4U3NXU&r=8OQr{#;sHP_#>>swKWSt^NXRt^Fzfzm5&y@0LzGX@4ET&C&-n`6 zvbsnwqr+{w02$>N=E6Hz2SYEp$#R)Px&O?363_whl7$kF-3adg{tWZ?CiW31KbyiaoX_{2&(l#oJ$k_3u3 z8NIb*S7d6)VEuqjU9u!&uwaW*QJh%8S4g;?5d zhhLRp57uzeCp?nM<$LT;elHT=NgIIhB#KT(otXAEcL}l+DUeLz;Jc#nPQ5bl3Ey|q znfbroIduB|z4>h%$`ne9{8~BOoERiE+Lg~dpMP=s*$TNtPCutKy;d>S+vK2946ra} zhw81fE7ignbxH!5oE83j$XttyCVwMRo_}akJsg-stuSvo6Z>#Bc%xP4?y;tkAI;Sq z*AT1p5UsX+$8{w1$@`~_OM;)belq#xqJohisIB2gP|VV)pzT+Q8O1^2R`Y`aog8@f zzkbWBwCK5FzqbfyLSnH?cN-Kgr$*1uOZ99VtksVuRXA6D1=zIgmoatQ2Ya$ND)umh3VsN9Am zXa0`e@V@?bU)#+K6sub7yd8$P!u|)RsEbx9MAh@A28r$HJ$gbPy(7n1Ll$**M%}mR zoy7wYxqR;FDf&&X-44=T1cdrPd099yRd+bZHWEc%Wv9BCJ1az>ql9u5eqJBPyMuueQgWfsgX7r#L!#5x(vXjTPuHqN z+<%koBw90e_)&;DYm$G%HAqez1^Fxo3IgGUnwU3#?wxc*5MWlD1#iG{tNSS;t1O&t7;h4A&i)=sc3fLV?!OK*iikQlU4VLJ(J z9HkfmhoV< zA3Fz_6?y0Hv+Q~>7X@8#{7xOR7jlnxIe)X(a5gHD8fRL@mJL~$PW#)mmlW{|UvGmh zpo!~tK}^#6L%4j zoFVGmyBKYnQUc31OkMuCd^->Enb6biJsY&?6s`zkXS!O=HRYL8qgFW=f5UrwEV?sG z`FB5hT;s}7HE#6>@Qd|>M+UA4cj0U;zQ{8!FW^0|Sf3#bRxTzPn!>_xgAvP#jtDyG hh6~*N|Dr%k^{9vPfrErmY^M3wfS0?k+g+DX-k&m2^gI9n literal 0 HcmV?d00001 diff --git a/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-80.png b/gui/res/ios/Assets.xcassets/AppIcon.appiconset/icon-80.png new file mode 100644 index 0000000000000000000000000000000000000000..2a4fad4f9756bab0f91e6f2dc8aef0147948c8f8 GIT binary patch literal 1707 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 ae3P9AqRu_bqGd^558&?NjqY?N=Kcj*f + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +