在Xcode中无法生成iOS应用程序档案

182

我有一个问题,无法从应用程序生成iOS App归档文件。 应用程序编译非常好,甚至可以在模拟器中正常工作。 现在我想进行一些adhoc测试,但无法生成iOS App存档文件。 当我单击产品->归档时,它会生成一个通用的xcode存档。 有人能帮帮我吗? 我应该提到,我已经为此应用程序生成了iOS App Archive。出于某种原因,它停止生成iOS Archive。 非常感谢。


7
尽管问题是关于从 Xcode 生成归档文件,但我在使用 xcodebuild 时遇到了这个问题。解决方法是指定目标:xcodebuild -destination generic/platform=iOS - db42
谢谢 @db42,解决了! - fabb
1
你能详细说明一下分辨率吗?在哪里进行更改? - jlo-gmail
如果在Project>Targets>Build Phases>target dependencies中有任何.xcodeproj文件,请将其从那里移除,然后构建您的ipa。这对我很有效。干杯 - Kalpesh Panchasara
40个回答

324

检查构建设置:

  1. 主项目目标的“跳过安装”设置为NO
  2. 框架(子项目)目标的“跳过安装”设置为YES
  3. 对于子项目的构建阶段,复制头文件需要在“项目”中而不是“公共”中 (如果构建静态库,则不适用)
  4. 部署下的安装目录是有效的(例如 /Applications)

2
这是最完整的答案,包含了以上部分回答。感谢Alex L!我认为这应该是这个问题的选定答案。 - Brandon
4
作为一个元问题,你是如何找到答案的?似乎我对所有构建相关的问题都依赖于Stackoverflow。 - philipkd
4
太好了!我原以为这是与配置文件相关的问题,但这个方法很有效。子项目是route-me/MapView的mapbox分支。如下面的帖子所述,复制头文件非常关键,可以在子项目的“构建阶段”中找到。 - rcarver
7
#3解决了我的问题,但在创建iOS应用程序归档之前,我还需要将文件从"Private"移动到"Project"。 - Thomas Hajcak
5
从技术上讲,问题不在于头文件在“复制头文件”下是公共的,而是因为构建设置>公共头文件文件夹路径设置为默认值/usr/local/include。如果您正在构建静态库,则头文件必须是公共的,因此更正确的做法是将#3中的公共头文件文件夹路径更改为类似于include/$(TARGET_NAME)这样更合理的内容。@CopperCash在下面的答案中指出了这一点。 - bcattle
显示剩余12条评论

76

如果您添加了框架/库,可能会出现此问题...您需要编辑该库的Target->Build Settings并将“Skip Install”设置为“Yes”。重新存档时,XCode应该开始再次生成'iOS App Archive'而不是'generic xcode archive'。


但是在Xcode 4.4.1中无法找到“跳过安装”选项,至少我无法在我的Xcode中找到跳过安装。 - Mashhadi
2
同样适用于添加的捆绑包。 - Mark Horgan

64

除了将 Skip Install 设置为 Yes 之外,如果你在应用程序项目中打开了另一个 lib/framwork 项目,则必须将头文件(如果有的话)从 public 移动到 projectBuild Phase / Copy Headers

构建阶段的 lib/framwork 目标


3
我差点失去了希望,因为对我来说“跳过安装”选项没有起作用。将标头复制到项目中解决了我的问题。谢谢! - ksm
10
为了帮助您本地化有故障的Xcode子项目,您可以在Finder中显示通用Xcode存档并浏览该包。在.xcarchive内,您将在Products/usr/local/include中看到有故障的头文件。 - MonsieurDart
1
把几个文件复制到公共头文件中,为什么会出现问题? - mskw
1
该死,谢谢,这对我有用。我想知道你是如何找到这些解决方案的 :) - Fabio Napodano
如果您无法确定哪个头文件导致了问题,您可以在归档后导出已保存的产品。打开保存的文件夹,然后打开其中的产品文件夹。在那里,您将看到一个“usr”文件夹,请按照该文件夹路径,它将指出仍标记为公共的头文件。 - Michael Wildermuth
显示剩余5条评论

45
我为了让它对我起作用,做了以下几点:
  1. 我有一个 three20 静态库,我使用cocoapods将文件包含在主项目中
  2. 按照上述所述的跳过所有其他子项目/静态库的安装并将复制标头从公共更改为项目
  3. 最重要的是:在您的每个库中,项目使用构建阶段->复制文件并确保目标绝对路径更改为产品目录。注意:请参见下面的提示,以缩小搜索范围,找到导致此错误的库。

就这样了!

提示: 要了解导致您的归档创建归档文件而不是ipa的有问题的文件,请执行以下操作:

  1. 选择归档文件并点击“分发”按钮。
  2. 选择“保存已构建的产品”选项。
  3. 点击下一步并保存。
  4. 在Finder中浏览创建的目录。
  5. 'libraries'子目录将识别需要将“跳过安装”设置为是的库。
  6. 在某些情况下,usr/local/include将确定您需要从Public移动到Project的罪魁祸首头文件或需要更改为产品目录的绝对路径(甚至是您忘记将跳过安装设置为是标志的文件)。但是该目录(即usr/local/include)取决于您的子库目录结构。在许多情况下..您将看到在步骤3中列出的所有文件也列在这里。如果您在此处找到它们,则可以确定问题的原因。

更新提示:为了使生活更加简单,只需在Xcode的全局搜索中搜索出现在上面提示第4步中的任何文件.. 您应该立即获得所需的结果.. 例如,这是我文件夹中的内容(按照上面提示的步骤):

enter image description here

所以我可以看出它与 加密SSL 库有关... 搜索它们:

enter image description here

让我意识到我忘记将跳过安装设置为是。

太好了!我将一些框架头文件更改为“私有”;由于某种原因,这导致它们被复制到“./usr/local/include”。 - Ben Mosher
1
能够帮助@BenMosher感到非常愉快 :) - abbood
1
我得到的最好的答案。谢谢你的提示,拯救了我的一天! - neywen
这绝对是我在寻找的答案——保存构建产品指向了问题的确切原因。 - Dennis L
这个详细的回答关于“保存构建产品”非常有帮助 - @abbood,非常感谢你。希望有一天我也能回报你的恩情。 - Scott Corscadden
在添加注释之前,已经完成了这个操作! - Scott Corscadden

21
如果你导出档案并打开后,在产品下看到/urs/local/include,请尝试此建议

在每个组件中,在Packaging下,将Private Headers Folder PathPublic Headers Folder Path设置为/usr/local/include。如果我清除它们,就能得到一个有效的档案。

进入图像描述

在我升级React Native应用程序至0.11.0,Xcode 7 和CocoaPods 0.39.0.beta.4之后,这对我有用。


1
我可以确认这是有效的!只要您记得清除私有和公共头文件路径。如果您只是选择所有的Pods,搜索头文件路径,然后同时清除它们,这也相当容易。 - Dids
1
我也可以确认这个有效,为我节省了很多时间。当我将我的pods升级到0.39.0.beta版本时发生了这个情况。 - Bryan P
太棒了。对我有用 :) 我挣扎了一天半。谢谢,谢谢,谢谢 :) :) :) - Srikanth
我认为这是适用于我的Xcode 7.0 iOS9的解决方案。虽然我没有使用任何cocoapods,但这仍然解决了问题。谢谢! - Geoff H
除此之外,我还必须在我的 WatchKit 扩展和应用程序上将 SKIP_INSTALL 设置为 Yes 才能使其正常工作。 - Snowman

12
如果你同时使用CocoaPods和WatchKit或Today Extension,CocoaPods仓库上有一个开放的问题解释了你可能遇到的问题。
对我来说,解决方案是从WatchKit Extension和Today Extension目标的Build Phases中删除Copy Pod Resources阶段。一旦我这样做了,项目就像预期的那样编译和归档了。
希望这可以帮助某些人,这个问题让我困惑了整整一天!

1
@Lewis42 可以随时添加赏金 ;) - rebello95
看来没有其他选项了,只能给你的评论点个赞了 ;) - lewis
@Lewis42,你需要在问题上添加赏金并将其授予一个答案。哈哈 - rebello95
@rebello95,你太棒了,伙计! - Matt

10
如果上述回答中没有解决您的问题,那么您的问题可能与有关。 最新更新<0.38.1>让事情变得混乱,但是我降级到<0.37.1>后一切恢复正常。使用 稍后编辑:升级到<0.38.2>也可以解决此问题。有关导致此问题的更多信息,请参见:Cocoapods 0.38.1 failed to create valid Archive

3
我已更新到版本 0.38.2,但仍然存在问题。您是否使用 Xcode 7? - Porter Hoskins
@PorterHoskins 我刚刚写了这个问题,Xcode 7无法从与Xcode 6中构建有效存档的同一项目构建有效存档。我正在使用Cocoa Pods 0.38.2,在使用Xcode 6时一切正常,但是在Xcode 7中,存档没有正确创建。你是否检查过你的文件夹结构,看看你的包中是否有一个.app之外的.appex文件? - Polar Bear
我在/Library/Frameworks有一个框架,我认为这可能与Google的cocoa pods没有建立为动态框架有关。这听起来类似于https://github.com/CocoaPods/CocoaPods/issues/3889。 - Porter Hoskins
3
我将每个Build Phases/Headers中的pod头文件从public移至项目部分,问题得以解决。因此问题可能确实出在CocoaPods上。 - Denis Kutlubaev

8

虽然我使用的是 Xcode5,但对我有帮助的是编辑 Build Scheme,尝试所有适用的上述建议在我的情况下并没有帮助。

我有两个目标,比如“App”和“App FREE”。当我尝试归档FREE版本时,我遇到了通用归档的问题,这是我在添加'normal'版本之后才添加的。在我的情况下,当我选择工具栏中的其方案并选择"编辑方案..."时,我发现生成部分有两个目标,即"App"和"App FREE"。

我取消了“App”的所有列,只留下“App FREE”的列,并点击"确定"。下次我选择“产品”>“归档”,我得到的是我的“App FREE”,而不是一个通用归档文件。:)


7

如果您只有一个项目,那么这个解决方案可能会很有用。

当我复制目标时,就会出现这个问题。结果是我建立了两个平行的目标。这导致了问题。通用IOS归档已经建立好了。

如果要关闭平行建筑,请执行以下操作:

  • 管理方案,
  • 编辑方案,
  • 构建,
  • 移除另一个目标。

5

更新到iOS 9和Xcode 7后,我遇到了这个问题。Josh H的解决方案对我有用:

在每个pod下,在“Packaging”下,“Private Headers Folder Path” 和 “Public Headers Folder Path”的设置为/usr/local/include。如果我清除它们,那么我就会得到一个有效的存档。

我还为我的Podfile编写了一个安装后脚本,以自动执行此操作!

    post_install do |installer_representation|
        installer_representation.pods_project.targets.each do |target|
            target.build_configurations.each do |config|
                config.build_settings['PUBLIC_HEADERS_FOLDER_PATH'] = [""];
                config.build_settings['PRIVATE_HEADERS_FOLDER_PATH'] = [""];
            end
        end
    end

只需将以下代码添加到您的Podfile末尾,并运行pod install即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接