我正在使用Xcode在Objective-C中编写iPhone应用程序,并且我在设备上运行了一些Lua脚本。
我遇到了一个问题,如果我编辑Lua脚本,保存,轻弹到Xcode和构建并运行(⌘Y),该Lua脚本的最新版本将被复制到应用程序包中但不会复制到设备
脚本不在Xcode项目中,我在Textmate中编辑它们。我有一个构建步骤,将脚本复制到应用程序包中并触摸文件,运行正常,最新的脚本版本在我运行应用程序时在应用程序包中。这些文件都已被触及,但由于某些原因,当将软件包复制到设备时,Xcode决定不复制最新文件。
如果我停止应用程序,然后再次构建并运行(⌘Y),则会复制最新版本。
我的解决方法是保存Lua文件,然后在Xcode中执行构建(⌘B),然后构建并运行(⌘Y),以便构建应用程序两次。这似乎总是将最新版本复制到设备。
更新
正如许多人所指出的,一种解决方案是清理目标并重建。您可以这样做,您也可以按照我上面提到的那样构建两次。这个问题很容易重现(在我的设置中,每次都会发生这种情况,无论最近目标是如何清理的)。我希望有一个更可靠/永久的解决方案
答案 0 :(得分:14)
您一定要将这些文件添加到XCode项目中。您仍然可以在其他编辑器中编辑它们,但如果将其添加到项目中,XCode会自动将它们包含在您的包中。如果在构建时没有复制它们,我就是这样解决的:
右键单击XCode中的文件,然后选择“触摸”,更新文件上的时间戳,使其显示为“新”。
在模拟器上,从“文件”菜单中选择“重置内容和设置”。
在XCode中,执行Build Clean
当你构建并运行之后,它应该安装文件就好了。
编辑:
要将项目中的外部文件夹添加到捆绑包中并保持文件夹结构不变,您只需执行以下操作:
点击左侧文件列表顶部的项目图标。
单击“项目”菜单,然后单击“添加到项目”。
选择要包含的文件夹,然后单击“添加”。
取消选中“复制”复选框,然后将“为任何已添加文件夹递归创建组”更改为“为任何已添加文件夹创建文件夹参考”。
构建目标时,打开捆绑包,目录结构将完全存在于内部。
答案 1 :(得分:13)
首先:我感受到你的痛苦。如果你想使用自定义脚本做一些有趣的(甚至只是简单的)数据流水线操作,我还没有找到任何关于卷起袖子和深入iOS构建管道的好文档。
其次:我不同意您需要,甚至 将所有资产放入您的xcode项目中。这真的是个人偏好的问题,如果你有一个足够复杂的项目,XCode就会成为一个独立导航你的代码的野兽,更不用说你所有的艺术资产和数据文件。
第三:清理是一种解决方法,就像接触一个单独的源代码文件一样(XCode会接受这个并为你做签名/触摸主目录而不需要进行干净的构建 - 如果你有一个大型项目或重要资产,那么干净的构建是非常耗时的,但这些实际上只是在不修复底层问题的情况下让事情发挥作用:你需要达到正确的依赖关系让复制步骤开始。
我在这里遇到了同样的问题,但有以下不同之处: 我正在使用gnu make脚本来处理艺术资源(音频,数据文件,图像),通过做一些基本的操作(压缩,剥离不需要的东西,构建字体等)。我正在使用gnu make,因为1.)我知道它2.)我发现将所有规则放到一个脚本中更容易3.)我喜欢保持我的数据文件夹很好和heirarchical和4.)XCode并不总是您希望如何界面/组织/管理所有数据! (虽然我认为在一个不太复杂的项目中代码甚至少量数据都能很好地完成)
无论如何,我发现我真的有两个问题:1。)代码签名和2.)复制。复制很简单,您只需触摸build products文件夹即可。在我的情况下,我将以下内容添加到我的make文件中:“touch $(DIR_CONTENTS)”我在执行xcode时使用xcode为shell提供的现有env parms定义了“$(DIR_CONTENTS)”:“DIR_CONTENTS = $( BUILT_PRODUCTS_DIR)/ $(CONTENTS_FOLDER_PATH)“(如果单击输出日志中的3条水平线,则可以看到env parms的完整列表)。在您的情况下,您需要在lua脚本中执行等效操作。不知道那是什么意思,我多年来故意躲避lua,但我无法想象它太疯狂了。
接下来的一点比较棘手,因为我发现只是因为你已经更新了,并不意味着代码签名的东西很好用。在我的情况下,我需要添加一个ResourceRules.plist文件,并将我的艺术目录(art /.*)添加为字典,省略一行和一个权重。我无法在任何地方找到文档,因此我将ResourceRules.plist文件从生成的文件夹复制到我的源文件夹中,将其添加到项目中,然后将代码签名的内容指向它。 (这将在代码签名下的构建规则中:它将是您的“代码签名资源规则路径”)
这不是我理想的解决方案,顺便说一句。如果我的数据发生变化,我宁愿能够通过我的脚本触发代码签名步骤,但正如我之前所说的,我没有在苹果开发人员库中找到任何有用的文档来了解如何真正深入了解自定义构建。您可以手动执行代码签名,但我不喜欢它。
希望有所帮助。
<强>更新强>
我想我会添加一些示例代码....这里有一些来自我的makefile的相关摘录:
# Near the beginning, where I do my variables n' such, I define the
# directory in a variable. Note that BUILD_PRODUCTS_DIR and CONTENTS_FOLDER_PATH
# are environment variables set by XCode and will be filled with the corresponding
# paths
DIR_CONTENTS = $(BUILT_PRODUCTS_DIR)/$(CONTENTS_FOLDER_PATH)
DIR_DEST_ART = $(DIR_CONTENTS)/art
DIR_DEST_FONTS = $(DIR_DEST_ART)/fonts
# ... more folders defined here...
DIR_SRC_FONTS = $(SRCROOT)/source-art/fonts
# ... more folders defined here...
# ... do some useful build stuff ...
# This is an example of my rule that takes the .png's built by my font script
# and compresses them to .pvrs (note: this isn't final, so YMMV). The thing to
# note here is that if this rule kicks off, the last thing that will happen is
# that I will touch my DIR_CONTENTS folder, which will kick off the copy to the
# device. I find having to touch the folder really annoying, I prefer the way xcopy
# and similar copy methods recursively travel & update if required.
$(DIR_DEST_FONTS)/%.pvr : $(DIR_SRC_FONTS)/%.png
@echo == Compress $(subst $(SRCROOT),src,$<) to $(subst $(DIR_DEST_ART),dest,$@) ===
@mkdir -p $(dir $@)
@xcrun -sdk iphoneos texturetool -e PVRTC -o $@ -f PVR $<
@touch $(DIR_CONTENTS)
然后,为了处理代码签名问题,我编辑了我的ResourceRules.plist,如下所示。要注意的领域是以“art /.*”
开头的关键<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>rules</key>
<dict>
<key>.*</key>
<true/>
<key>art/.*</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<integer>0</integer>
</dict>
<key>Info.plist</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>ResourceRules.plist</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>100</real>
</dict>
</dict>
</dict>
</plist>
答案 2 :(得分:12)
由于我尚未理解的原因,有时构建过程似乎变得健忘或者根本不可靠。
此类情况的常见故障排除方法是清除XCode中的所有内容,同时从手机中删除该应用
答案 3 :(得分:1)
为什么脚本不在Xcode项目中?当您使用Textmate编辑它们时,它们仍然可以在项目中。也许将它们包含在Xcode项目中会使它们更有可能被转移到设备上?
答案 4 :(得分:1)
只需清除xcode中的所有目标。然后重启xcode。
然后尝试在设备中安装。它会起作用。
答案 5 :(得分:1)
听起来你有一个“一次性”的问题,你更新的脚本会让它“太迟”了。您是否尝试更改构建阶段的顺序,特别是将复制阶段移至最后但不是在编译和链接阶段之前?
答案 6 :(得分:1)
我在资源更新时在设备构建中处理此问题:
这对我来说在设备构建上运行不错,不会花费太多时间。
答案 7 :(得分:0)
我偶尔会在我的项目中包含的sqlite数据库中看到这个问题。有时它只是没有得到更新版本。
通常我的修复方法是进入Application Support / iPhone Simulator文件夹并删除Application文件夹中的应用程序,并删除Caches文件夹。
这将迫使模拟器重建所有这些并获取新文件。
答案 8 :(得分:0)
使用故障排除
清理XCode项目
构建并运行
答案 9 :(得分:0)
我有一个类似的问题,自动复制脚本文件,更改时。已将其类型设置为&#34; C&#34;允许自动语法高亮显示。已将文件添加到&#34;构建阶段/复制捆绑资源&#34;。但没有运气;对文件的更改不会更新软件包。
在这种情况下,修复是从&#34; C&#34;更改类型。到&#34; JSON&#34;。现在,它会在设备上自动更新捆绑包。有道理,因为二进制文件很少需要源文件。最初,Apple并不允许任何脚本编写。
答案 10 :(得分:0)
我今天使用Xcode 11.1遇到了同样的问题。我尝试从设备中删除该应用程序,清理项目并重建,删除资源,然后将其重新添加到项目中,但均无效果。
最终可行的方法是:我打开项目窗口,然后转到“构建阶段”,然后打开“复制捆绑资源”,然后简单地在列表中上下移动一些资源。我想这告诉Xcode某些事情已经改变。