Warm tip: This article is reproduced from serverfault.com, please click

Embedding files in an iOS app (C++/Qt/cmake)

发布于 2020-11-20 14:50:57

In an iOS c++/Qt application, I need to ship a few files and to keep them in their directory structure.

For the Android version, we bundle a zip which we unzip on the target before creating the QApplication.

On iOS, it seems that CMake is not capable of bundling files in a tree: https://cmake.org/cmake/help/latest/prop_tgt/RESOURCE.html#prop_tgt:RESOURCE https://cmake.org/cmake/help/latest/prop_sf/MACOSX_PACKAGE_LOCATION.html

I am not sure if this is a limitation of cmake or if this is a global limitation on iOS. From the docs about iOS bundles:

It uses a relatively flat structure with few extraneous directories in an effort to save disk space and simplify access to the files.

What would be the preferred approach?

  1. Is there a solution to ship the files from CMake directly?
  2. If not, how can I achieve this so that they are available before the QApplication is created?

The xcode command

Thanks to @Cy-4AH, I added the folder in Xcode and could get the command to do this:

CpResource _PATH_TO_DIRECTORY_ _APP_BUNDLE_DIRECTORY_/_RESOURCE_DIR_NAME_
cd /Users/denis/opt/qfield/ios/QField
export PATH="....."
builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -strip-debug-symbols -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip -resolve-src-symlinks _PATH_TO_DIRECTORY_ _APP_BUNDLE_DIRECTORY_

But how can I create this from cmake? builtin-copyis an xcode command.


Simple system copy command

From an old (2008) discussion, we could use simple cp commands. This works up to signing, but then I get an error unsealed contents present in the bundle root.

From this answer, it seems related that I cannot simply add folders in the resource directory. From the docs anatomy of framework bundles: Nonlocalized resources reside at the top level of the Resources directory

Questioner
Denis Rouzaud
Viewed
11
183k 2020-11-28 04:56:51

So apparently the CMake method also works for directories.

target_sources(${QT_IOS_TARGET} PRIVATE ${_resource})
set_source_files_properties(${_resource} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)

It will just be added at the root directory of the bundle and not within the Resources.