簡體   English   中英

在 iOS 應用程序中嵌入文件 (C++/Qt/cmake)

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

在 iOS c++/Qt 應用程序中,我需要傳送一些文件並將它們保存在它們的目錄結構中。

對於 Android 版本,我們捆綁了一個 zip,在創建 QApplication 之前將其解壓縮到目標上。

在 iOS 上,CMake 似乎無法將文件捆綁在樹中: 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

我不確定這是 cmake 的限制還是 iOS 的全局限制。 來自關於 iOS 包文檔

它使用相對扁平的結構,很少有無關目錄,以節省磁盤空間並簡化對文件的訪問。

什么是首選方法?

  1. 是否有直接從 CMake 發送文件的解決方案?
  2. 如果沒有,我怎樣才能做到這一點,以便在創建 QApplication 之前它們可用?

xcode 命令

感謝 @Cy-4AH,我在 Xcode 中添加了該文件夾,並且可以獲得執行此操作的命令:

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_

但是我怎樣才能從 cmake 創建這個呢? builtin-copy是一個 xcode 命令。


簡單的系統復制命令

從舊的(2008 年)討論中,我們可以使用簡單的cp命令。 這適用於簽名,但隨后我收到一個錯誤unsealed contents present in the bundle root

從這個答案看來,我不能簡單地在資源目錄中添加文件夾。 來自框架包的文檔剖析Nonlocalized resources reside at the top level of the Resources directory

(免責聲明:我不是 CMake 用戶,可能有更多的 CMake-ey 方法來做到這一點)

如果您可以設置構建后操作,以下終端腳本可以有效地將文件從另一個位置同步到您的包中。 我在我的游戲引擎中使用它,因為它只在后續構建時復制更新或新文件,並保留目錄結構:

mkdir -p PATHTO/ORIGINFOLDERNAME
mkdir -p PATHTOBUILDFOLDER/PROJECTNAME.app/Contents/Resources/DESTINATIONFOLDERNAME
rsync -avu --delete --exclude=".*" PATHTO/ORIGINFOLDERNAME/ PATHTOBUILDFOLDER/PROJECTNAME.app/Contents/Resources/DESTINATIONFOLDERNAME

mkdir命令僅用於確保生成文件夾(如果它們被刪除)。

所以顯然 CMake 方法也適用於目錄。

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

它只會被添加到包的根目錄中,而不是在Resources

如果嵌入的文件不是太大,您可以考慮:

  • 在您的源代碼樹中,生成一個 C++ 文件,將該文件嵌入為一個常量數組。 例如,如果你的文件只包含hello, world和一個新行,你可以有類似的東西

    /// file contents.cc const char file_contents[] = "hello, world\\n";

並在您的程序開始時(可能在您的main函數中,在您的QApplication之前)調用一個 C++ 函數來編寫這樣一個文件(可能在/tmp/ )。

  • 在你的構建自動化(例如你的Makefile或你的 qmake 東西)中,有一些東西可以從真正的源代碼中生成C++ contents.cc文件

這是從 POSIX/Linux 的角度來看的,根據您的 iOS 調整我的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM