summaryrefslogtreecommitdiffstats
path: root/tests/manual/ios_assets/CMakeLists.txt
blob: a9abe52b02ce46a5ab357386c6b674d62a2f89f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause

cmake_minimum_required(VERSION 3.16)
project(ios_assets LANGUAGES CXX)

set(CMAKE_AUTOMOC ON)

find_package(Qt6 REQUIRED COMPONENTS Core Gui Test)

qt_add_executable(tst_manual_ios_assets
    main.cpp
)

set_target_properties(tst_manual_ios_assets PROPERTIES
    MACOSX_BUNDLE TRUE
)
target_link_libraries(tst_manual_ios_assets PRIVATE
    Qt::Core
    Qt::Gui
    Qt::Test
)

# Custom Info.plist
if(IOS)
    if(XCODE_VERSION AND XCODE_VERSION VERSION_LESS "14")
        set(plist_path "${CMAKE_CURRENT_SOURCE_DIR}/Info.ios.cmake.xcode.13.0.plist")
    else()
        set(plist_path "${CMAKE_CURRENT_SOURCE_DIR}/Info.ios.cmake.xcode.14.3.plist")
    endif()
    set_target_properties(tst_manual_ios_assets
        PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${plist_path}")
endif()

# Custom resources
file(GLOB_RECURSE text_files CONFIGURE_DEPENDS "*.txt")
if(text_files)
    list(FILTER text_files EXCLUDE REGEX CMakeLists.txt)
    target_sources(tst_manual_ios_assets PRIVATE ${text_files})
    # On iOS the 'Resources' prefix is removed by Xcode because on iOS app bundles are shallow,
    # so the final location of the text file will be
    #    tst_manual_ios_assets.app/textFiles/foo.txt
    # On macOS the location will be
    #    tst_manual_ios_assets.app/Contents/Resources/textFiles/foo.txt
    set_source_files_properties(
        ${text_files}
        PROPERTIES MACOSX_PACKAGE_LOCATION Resources/textFiles)
endif()

# App icons
# https://developer.apple.com/library/archive/qa/qa1686/_index.html
# https://help.apple.com/xcode/mac/current/#/dev10510b1f7
# https://web.archive.org/web/20180124234409/https://developer.apple.com/ios/human-interface-guidelines/icons-and-images/app-icon/
# https://doc.qt.io/qt-6/ios-platform-notes.html#icons
# No need to copy the icons into the bundle manually when using Xcode 13+.
# - rely on Xcode 13 to copy the needed icon files that are specified in the asset catalog (all the
#   required ones should be specified manually)
# - rely on Xcode 14 to generate the needed icon files based on the 1024x1024 sized image in the
#   asset catalog

# Asset catalog with images and icons.
if(IOS)
    enable_language(OBJCXX)
    if(XCODE_VERSION AND XCODE_VERSION VERSION_LESS "14")
        set(asset_catalog_path "${CMAKE_CURRENT_SOURCE_DIR}/AssetsXcode13.0.xcassets")
    else()
        set(asset_catalog_path "${CMAKE_CURRENT_SOURCE_DIR}/AssetsXcode14.3.xcassets")
    endif()
    target_sources(tst_manual_ios_assets PRIVATE "${asset_catalog_path}")
    set_source_files_properties(
        ${asset_catalog_path}
        PROPERTIES MACOSX_PACKAGE_LOCATION Resources)

    # Make sure asset catalog compilation generates the needed app icons image sizes.
    # This might not be needed in a future Qt version where qt_add_executable might do it
    # automatically. Unclear how to do it cleanly though, because specifying the option when
    # the asset catalog doesn't have an AppIcon set will cause a build failure.
    set_target_properties(tst_manual_ios_assets PROPERTIES
        XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME AppIcon)

    target_sources(tst_manual_ios_assets PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/utils.mm")
endif()

# Set custom launch screen.
# iOS has evolved and provides a few ways to handle this.
# - UILaunchImageFile Info.plist key, introduced in iOS 3.2, supposedly deprecated in iOS 10.
# - UILaunchImages, Info.plist keys,  introduced in iOS 7, deprecated in iOS 13
# - UILaunchStoryboardName, Info.plist key, introduced in iOS 9, not deprecated
# - UILaunchScreen / UILaunchScreens, Info.plist dictionaries, introduced in iOS 14, not
#    deprecated
# The first two expect images, the third one expects a storyboard / .xib file.
# The last ones expect a dictionary of keys to configure the launch screen.
# At the moment, UILaunchStoryboardName represents the lower bound of what Qt supports,
# so use it here.
# Reference info
# https://developer.apple.com/documentation/xcode/specifying-your-apps-launch-screen/
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW24
# https://developer.apple.com/documentation/uikit/uilocalnotification/1616660-alertlaunchimage?language=objc
# https://developer.apple.com/documentation/bundleresources/information_property_list/uilaunchimages?language=objc
# https://developer.apple.com/documentation/bundleresources/information_property_list/uilaunchstoryboardname?language=objc
# https://developer.apple.com/documentation/bundleresources/information_property_list/uilaunchscreen?language=objc
# https://forum.qt.io/topic/106251/use-launch-images-in-ios-project/4
# https://codereview.qt-project.org/c/qt/qtdoc/+/100846
if(IOS)
    # Because we're not using the automatically generated Info.plist, it needs to be manually
    # modified to have the UILaunchStoryboardName key.
    set_target_properties(tst_manual_ios_assets PROPERTIES
        QT_IOS_LAUNCH_SCREEN "${CMAKE_CURRENT_SOURCE_DIR}/CustomLaunchScreen.storyboard")
endif()

# Flip to TRUE to debug
if(FALSE)
    target_compile_definitions(tst_manual_ios_assets PRIVATE DEBUG_APP_DATA_LOCATION=1)
endif()