目前我正在使用一些脚本来生成文件,并将它们作为资源包含在Xcode中。问题是我先运行脚本,然后将其从项目中删除,再将其添加回项目中。肯定有一种方法可以自动化这个最后一步,使得脚本可以生成文件并自动将它们添加到xcode项目中。
我正在使用bash,但任何语言的示例都会有所帮助。
谢谢, 安德鲁
目前我正在使用一些脚本来生成文件,并将它们作为资源包含在Xcode中。问题是我先运行脚本,然后将其从项目中删除,再将其添加回项目中。肯定有一种方法可以自动化这个最后一步,使得脚本可以生成文件并自动将它们添加到xcode项目中。
我正在使用bash,但任何语言的示例都会有所帮助。
谢谢, 安德鲁
find -L ${SRCROOT}/SomeDerivedResources \
-type f -not -name ".*" \
-not -name "`basename ${INFOPLIST_FILE}`" \
| xargs -t -I {} \
cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/
看起来有点吓人,但是让我们来分解一下:
find -L ${SRCROOT}/SomeDerivedResources
这个命令会遍历我们源代码根目录下的SomeDerivedResources目录(-L
参数告诉它要跟随符号链接)。
-type f
仅包含常规文件
-not -name ".*"
-not -name "`basename ${INFOPLIST_FILE}`"
| xargs -t -I {}
-t
将find
的结果导入到xargs
中(将生成的命令回显到stderr,以便在构建日志中显示),使用-I
(对每个输入文件运行一次命令),并使用{}
作为我们的参数占位符。cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/
{} 表示)复制到我们产品的资源目录中。
在键入此内容时,我意识到使用rsync设置而不是cp可以防止每次构建时复制资源。如果您的资源非常大,值得一试。
(另外,文件夹引用对于我的需求无法工作,有几个原因。首先,我的图标位于DerivedResources目录中,在捆绑包的子目录中似乎无法工作。此外,我理想情况下希望能够使用 [UIImage imageNamed:@“MyAwesomeHappyImage.png”] 和 -pathForResource:ofType:(我的某些文件更深地嵌套在我的DerivedResources目录中)。如果您的需求不包含这些限制,我强烈建议您选择文件夹引用路线。)
您可以通过为应用程序添加新的构建阶段来完成此操作。
在Xcode项目浏览器中找到应用程序的目标,并展开它以显示所有构建阶段。
向您的目标添加一个新的"运行脚本"构建阶段。最简单的方法是右键单击目标,然后选择“添加/新建构建阶段/新建运行脚本构建阶段”
添加新的构建阶段应该会弹出检查器窗口。在此窗口中,您可以输入整个shell脚本,或者只是要运行脚本的命令行。
重点在于:在检查器窗口底部,您可以指定输入文件和输出文件。指定输入文件会自动设置依赖项(只有在修改了某些输入文件时才会执行shell脚本)。指定输出文件会自动将依赖关系传播到这些文件。当运行您的shell脚本时,Xcode知道它需要处理那些由shell脚本修改的文件。
请务必将新的构建阶段拖到阶段列表的顶部,如下图所示。如果您需要将这些资源文件包含在捆绑包中,则顺序很重要。
保存、构建、提交到存储库,请求加薪,呼吸新鲜空气并度过愉快的一天! :)
对于有大量文件的用户,为避免需要重新复制(或重新检查)每个文件,如@Ben Cochran建议的那样(感谢他提供的脚本),以下是使用rsync的方法:
// this won't work
UIImage * image = [UIImage imageNamed:@"Rendezvous"];
if (image) {
NSLog(@"Found Rendezvous!");
} else {
NSLog(@"Didn't find Rendezvous.");
}
// but this will!
image = [UIImage imageNamed:@"MyImages/Rendezvous"];
if (image) {
NSLog(@"Found MyImages/Rendezvous!");
} else {
NSLog(@"Didn't find MyImages/Rendezvous.");
}
`
我成功解决了这个问题:
"Code object is not signed at all"
这个问题在上传到iTunes Connect时可能会遇到。解决方法如下:
我没有将脚本包含在Bundle资源中。
因此,脚本(在这种情况下是Python文件)在构建过程中被执行(它执行它该执行的操作),但未包含在应用程序的bundle中。
如何解决?
打开Build Phases,进入Copy Bundle Resources部分,选择该文件并使用减号(-)删除它。