使用编译器指令在文件丢失时发出警告
Posted
技术标签:
【中文标题】使用编译器指令在文件丢失时发出警告【英文标题】:Using compiler directive to warn if a file is missing 【发布时间】:2017-02-21 20:47:26 【问题描述】:我有一个包含在捆绑包中的文件,其名称如下:
databaseX.sqlite
其中 X 是应用的版本。如果版本为 2.8,则文件应命名为 database2.8.sqlite
。当应用程序提交给 Apple 时,我必须确保包含此文件。
是否可以创建编译器指令来检查文件是否在包中?
我试过了,没有成功
#define fileInBundle [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"LoteriaMac%@.sqlite", [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"]]]
#if defined(fileInBundle)
#pragma message("file in bundle")
#else
#pragma message("file missing")
#endif
file in bundle
始终显示,即使文件不在捆绑包中。
【问题讨论】:
【参考方案1】:这是不可能的。您正在尝试在编译指令中使用运行时检查。
一般来说,在编译时,您无法知道包中是否有文件,因为文件通常在编译后独立于代码添加到包中。
这与编译时检查另一台计算机的文件系统中是否存在文件相同。
要在构建期间检查,您可以在目标中创建自定义构建脚本(构建阶段 => +
按钮),类似于:
APP_PATH="$TARGET_BUILD_DIR/$WRAPPER_NAME"
// there is probably some easier way to get the version than from the Info.plist
INFO_FILE="$APP_PATH/Info.plist"
VERSION=`/usr/libexec/plistbuddy -c Print:CFBundleShortVersionString "$INFO_FILE"`
// the file we want to exist
DB_FILE="$APP_PATH/database$VERSION.sqlite"
// if the file does not exist
if [ ! -f "$DB_FILE" ]; then
// emit an error
echo "error: File \"$DB_FILE\" not found!" >&2;
// and stop the build
exit 1
fi
【讨论】:
既然是在“提交”之前,这可以在编译时在脚本中完成吗?当然,另一个人可以删除它。 @Larme 你可以在构建或构建后脚本中做任何事情。 @Sulthan - 你知道如何在构建阶段使用脚本吗? @SpaceDog 我已经添加了一个示例脚本,可能可以简化或者可能需要一些小的改动。简而言之,它只是在文件存在时查看应用程序。 当我按下 (+) 时,看到了 3 个选项New copy files phase
和 new run script phase
和 new headers phase
。我想正确的是第二个。我选择了那个,但脚本总是打印这个:Print: Entry, ":CFBundleShortVersionString", Does Not Exist
,然后一行告诉我文件Info.plist.sqlite
(?)找不到...以上是关于使用编译器指令在文件丢失时发出警告的主要内容,如果未能解决你的问题,请参考以下文章