无法在Xcode中生成iOS App存档


175

我从应用程序生成iOS App存档时遇到问题。该应用程序可以很好地编译,甚至可以在模拟器中运行。现在,我想进行即席测试,并且无法生成iOS App存档。当我单击产品->存档时,它将生成一个通用的xcode存档。谁能帮我。我应该提到,我已经生成了此应用程序的iOS应用程序存档。由于某种原因,它刚刚停止生成iOS存档。非常感谢。


7
即使问题是关于从xcode生成归档文件,我也遇到了使用的问题xcodebuild。解决方案是指定目的地:xcodebuild -destination generic/platform=iOS
db42

感谢@ db42,做到了!
fabb

1
您能否详细说明分辨率-在哪里进行更改?
jlo-gmail

如果在“项目”>“目标”>“构建阶段”>“目标依赖项”中有任何.xcodeproj文件,请从此处删除它,然后构建您的ipa。这个对我有用。干杯
Kalpesh Panchasara

Answers:


315

检查构建设置:

  1. 对于主要项目目标,跳过安装是否
  2. 对于框架(子项目)目标,跳过安装为是
  3. 在子项目的构建阶段中,副本头必须在项目中,而不是公共(在构建静态库时不适用)
  4. 部署下的安装目录有效(例如/ Applications)

2
这是最完整的答案,其中包含上述部分答案。谢谢亚历克斯·L!我认为这应该是该问题的选择答案。
布兰登

3
作为一个元问题,您如何解决这个问题?似乎我依赖Stackoverflow来解决所有与构建有关的问题。
philipkd

4
美丽!我以为这是供应配置文件的问题,但是效果很好。子项目是route-me / MapView的mapbox分支。复制标题是关键,如下文所述,可以在子项目的“构建阶段”中找到。
rcarver

7
#3解决了我的问题,但是在将存档构建为iOS App存档之前,我还需要将文件从Private移到Project。
Thomas Hajcak 2013年

4
从技术上讲,问题不是标题在“复制标题”下是“公共”,而是“构建设置”>“公共标题文件夹路径”设置为默认值/usr/local/include。如果您要构建静态库,则标头必须为Public,因此如果#3将“ Public Headers Folder Path”更改为更合理的名称,则更为正确include/$(TARGET_NAME)。@CopperCash在下面的答案中对此进行了说明。
bcattle

75

如果添加了框架/库,则会发生这种情况……您需要编辑该库的“目标”->“构建设置”,并将“跳过安装”设置设置为“是”。重新存档时,XCode应该再次开始生成“ iOS App存档”,而不是“通用xcode存档”。


但是“跳过安装”在xcode 4.4.1中不可用,至少我无法在我的xcode中找到skip
intall

2
添加的捆绑包也是如此。
Mark Horgan

62

除了将“ 跳过安装”设置为“ 是”之外,如果您在应用程序项目中打开了另一个lib / framwork项目,则还必须在构建阶段 / 复制标题中将标题(如果有)从public移到项目

lib / framwork目标的构建阶段


3
我快要失去希望了,因为“跳过安装为是”对我不起作用。将标头复制到Project对我有用。谢谢!
ksm 2012年

10
为了帮助您定位有故障的Xcode子项目,可以在Finder中显示Generic Xcode Archive并浏览该包。在.xcarchive内部,您将在Products / usr / local / include中看到错误的标题。
MonsieurDart

1
为什么要放一些文件来复制标头以公开搞砸呢?
mskw

mskw,我想如果构建的工件包含一个或多个公共头文件,它就不能成为“设备可部署的”存档(从中生成IPA的iOS App存档)。它仍然是Xcode项目档案。谢谢
ebtokyo

1
该死的,谢谢你,为我工作的部份。我想知道你到底是如何设法找到这些类型的解决方案:)
法比奥Napodano

45

我做了以下工作以使其适合我:

  1. 我有一个three20静态库,我用过cocoapods将文件包含在主项目中
  2. 跟随所有其他子项目/静态库的跳过安装,并如上所述将副本标题从public切换到project
  3. 最重要的是:在每个库中,您的项目都使用go来构建阶段->复制文件,并确保将目标从更改Absolute pathproducts directory。注意:请参见以下提示以缩小搜索范围,以查找导致此错误的库。

就是这样!

提示:要了解引起档案文件创建档案文件而非ipa的问题文件,请执行以下操作:

  1. 选择存档,然后单击分发按钮。
  2. 选择“保存内置产品”选项。
  3. 点击下一步并保存。
  4. 在Finder中浏览创建的目录。
  5. “库”子目录将标识将“跳过安装”设置为“是”所需的库。
  6. 在某些情况下,usr/local/include将识别出从“公共”移动到“项目”所需的罪魁祸首文件,或者从绝对路径更改为产品目录所必须更改的文件(甚至忘记了将“跳过安装”设置为“ yes”标志的文件)。但是该目录(即usr / local / include)取决于您的子库目录结构。在许多情况下..您将在此处列出的上述第3步中的“ 复制文件”下看到列出的所有文件。如果在这里找到它们,那么您将对问题的原因有明确的答案。

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

enter image description here

所以我可以说它与cryptossl库有关..搜索它们:

enter image description here

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


很好的提示!我已经将一些框架标题更改为“私有”;由于某种原因,这导致它们被复制到./usr/local/include
Ben Mosher

1
能够帮忙@BenMosher总是很荣幸:)
大约

1
我得到的最好的答案。感谢您的提示,保存了我的一天。!
neywen

绝对可以找到我想要的答案-保存构建产品使我找到了问题的确切原因。
丹尼斯·L

关于“保存内置产品”的广泛答案非常有帮助 -@abbood,非常感谢。希望有一天我能回报你。
Scott Corscadden '16

21

如果您导出存档,请打开存档,然后/urs/local/include在“ 产品”中尝试以下建议

在每荚下PackagingPrivate Headers Folder PathPublic Headers Folder Path设置成/usr/local/include。如果我清除它们,则会得到有效的存档。

enter image description here

将我的React Native应用程序升级到0.11.0Xcode 7和CocoaPods 后为我工作0.39.0.beta.4


1
我可以确认这有效!只要您记得清除私有和公共标头路径。如果只选择所有窗格,搜索标题路径,然后同时清除所有窗格,这也非常容易。
Dids

1
我还可以确认这样做可以节省很多时间,这是在我将广告连播升级到0.39.0.beta版本
Bryan P

太棒了 为我工作:)我在1天半的时间里苦苦挣扎。谢谢,谢谢,谢谢:) :) :)
Srikanth

我认为这是为我工作的Xcode 7.0 iOS9。我没有任何椰子,但这仍然解决了这个问题。谢谢男人
Geoff H

除此之外,我还必须在WatchKit扩展程序和应用程序上将SKIP_INSTALL设置为“是”,此功能才能起作用。
雪人2015年

12

如果您使用的是CocoaPods以及WatchKit或Today Extension,则CocoaPods回购中有一个未解决的问题,可能会解释您的问题所在。

对我来说,解决方案Copy Pod Resources从下的WatchKit扩展目标和Today扩展目标中删除该阶段Build Phases。完成此操作后,该项目将按预期进行编译和存档。

希望这对某人有帮助,这让我难过了一整天!


1
@ Lewis42总是可以添加赏金;)
rebello95

看不到选项,您必须对自己的评论进行投票;)
刘易斯

@ Lewis42您必须将悬赏金添加到问题中并将其授予答案大声笑
rebello95 2015年

@ rebello95,你摇滚家伙!
马特

10

如果以上任何一个答案都无效,则可能是您的问题cocoaPods。最新的更新0.38.1使我感到困惑,但后来我降级了0.37.1,一切恢复了正常。使用Xcode 6.3.1

以后编辑:更新为0.38.2也将解决此问题。有关导致此问题的原因的更多信息,在这里:Cocoapods 0.38.1无法创建有效的存档


3
我更新到了0.38.2,仍然有问题。您在使用Xcode 7吗?
波特·霍斯金斯

@PorterHoskins我刚刚写了这个问题,因为Xcode 7不会从在Xcode 6中构建有效存档的同一项目中构建有效存档。我正在使用Cocoa Pods 0.38.2,使用Xcode 6时一切都很好,但是使用Xcode 7时,归档文件创建不正确。您是否检查了文件夹结构,以查看软件包中的.app之外是否有.appex文件?
北极熊

我有一个框架/Library/Frameworks。我认为这可能与未将Google可可豆荚构建为动态框架有关。听起来类似于github.com/CocoaPods/CocoaPods/issues/3889
波特·霍斯金斯

3
我将构建阶段/标题中的每个pod标题从公众那里移到了项目部分,并且它起作用了。所以确实问题可能出在CocoaPods中。
丹尼斯·库特鲁巴耶夫

7

尽管我使用的是Xcode5,但对我排序的却是编辑构建方案-尝试以上所有适用的建议对我的情况没有帮助。

我有两个目标,例如“ App”和“ App FREE”。我在尝试存档免费版本时遇到了通用存档的问题,该版本是在应用程序的“正常”版本之后添加的。就我而言,当我在工具栏中选择其Scheme并选择Edit Scheme ...时,我看到Build部分有两个目标,即App和App FREE。

我取消选中App的所有列,仅选中App FREE的列,然后单击“确定”。下次我选择产品>存档时,我获得了免费的应用程序,而不是通用存档。:)


7

如果您只有一个项目,则此解决方案可能会有用。当我复制目标时,发生了此问题。结果,我并行构建了两个目标。这是造成问题的原因。通用的IOS存档已建立。

要关闭并行的构建,请转到

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

5

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

在每个窗格中的“打包”下,“专用头文件夹路径”和“公共头文件夹路径”设置为/ 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


5

我的工作区中有多个项目(GTL,Pods和主项目),这对我有用:

选择项目,将有两种类型,有项目目标

对于项目,是不是你的主喜欢GTL或者PODS

项目:

Skip Install = NO
Installation Directory = /Applications
// For pods
Private Headers Folder Path = ""
Public Headers Folder Path = ""

目标:

Skip Install = YES
Installation Directory = /Applications
// For pods
Private Headers Folder Path = ""
Public Headers Folder Path = ""

对于主项目(通常与您的产品名称相同):

项目:

Skip Install = NO
Installation Directory = /Applications

目标:

Skip Install = NO
Installation Directory = /Applications

检查每个项目和目标上的ios部署目标,以确保它们都相同。


感谢您逐步解释它。确实帮助我解决了问题。
Arslan

4

我有这个问题。就我而言,这是由于将Mac应用程序目标保留为iOS应用程序的依赖关系所致。

之所以这样设置,是因为Mac应用程序是用于为iOS应用程序生成一些数据的工具,该工具随后包含在捆绑软件中。

在构建iOS应用本身之前,我必须删除该依赖性并单独构建工具。


像lippd这样的库同时包含ios和osx目标,我忘了删除osx目标... doh
james_alvarez

4

在我的场景中,只有在开始将Swift代码包含到我的主要Objective-C项目中之后,我才得到错误的“通用存档”。经过大量的故障排除和对Xcode吐出的存档文件的检查之后,我注意到该SwiftSupport文件夹(具有Swift运行时所需的dylib)位于我的存档中,而不是来自全新的Swift项目应用程序存档中的文件夹。 。

我找到了Installation Directory构建设置,并注意到它已在我的项目中设置为自定义路径。我只是将其删除(将其设置为的通用值/Applications),然后按我的预期工作了下一个Build-> Archive,并给了我适当的iOS App Archive。

TL; DR:在您的应用程序中包含Swift代码时,请确保您的Installation Directory构建设置被设置为其默认值/Applications,尤其是当您从一个较旧的项目文件开始时,该文件可能具有一些意外的旧版构建设置。


3

离开这里是为了拯救其他人脱离同一旅程。

我发现我也需要从工作区中的静态库目标中删除相同的“复制Pod资源”构建阶段。


在尝试了上述内容之后,这对我
有用

2

除了Alex L的答案。

第3点。将“构建设置”->“公共标题文件夹路径”更改为“ include / xxx”也可以。


这比上面的#3更正确。如果您要构建静态库,则标头必须公开
-bcattle

2

如果以上所有方法都没有帮助您...经过很多时间.......

我删除了Bundle Version的Info.plist中的值,因为我对Bundle Version Short 1.0感到很满意。坏。不要这样

*请注意,实际上是通过在右侧的UI中对其进行编辑来实现的,但没有意识到它将在Info.plist文件中放置一个空键。我认为这使其无效。归档时我的捆绑包显示为其他项目,并且没有图标,并且我无法上传到任何地方。

这归结为Info.plist中的无效值。如果不是有效的档案,请尝试解压缩旧档案并放入/覆盖当前档案,并在重建档案时查看它是否可以解决。


1
  1. 转到构建设置并添加

    yourAppName / Resources / dist.plist代码签名权利

  2. 使用iOS设备或选择实际设备作为构建目标按cmd + B

  3. 完成后->滚动到“产品”文件夹,然后右键单击yourAppName.app

  4. 选择“在Finder中显示”

  5. 创建一个具有名称有效负载的文件夹(大写的“ P”

  6. yourAppName 复制到您的有效负载文件夹中

  7. 从您的有效负载文件夹创建一个zip

  8. 邮政编码重命名yourAppName.ipa

完成


1

尝试了几乎所有内容之后:

  • 清理,存档
  • 删除DerivedData,存档
  • 重新启动Xcode(我使用的是XCode7),存档
  • 以上的组合...

然后,我注意到我的启动分区“可用磁盘空间不足”……大约1GB。我重新启动,然后获得了大约18GB的可用空间。

然后打开Xcode和项目,执行Archive ...,令人惊讶的是(经过一个小时的尝试建立一个Archive),我终于得到了一个非通用Archive。

不知道它是修复了它的空闲磁盘问题,还是重新启动了修复它的macOS,但这对我有用。



0

就我而言,我必须将FMDB和BlocksKit都移到静态库中。以前,它们是作为子项目构建的。请记住,您可以使用lipo创建通用库。在构建最终产品时,将自动剥离模拟器代码。


0

另一个可能的原因是在“目标依赖项”中引用了不同平台的项目。在我的特定情况下,我正在开发一个项目,该项目共享OSX和iOS的代码。在一个iOS目标中,我意外添加了OSX目标作为依赖项。


0

为了更全面,我发布了解决方案。

我尝试在Xcode 5.1.1(5B1008)中构建iOS项目的存档时遇到了完全相同的问题。以上建议均不能解决问题,并且大多数建议都无关紧要(我没有添加任何框架,并且在构建阶段的“复制标题”部分中没有任何公共条目)。

就我而言,解决问题包括简单地关闭我的项目,删除以前创建的所有存档,转到“首选项”>“帐户”,删除我的开发人员帐户,退出Xcode,重新启动,重新添加我的开发人员帐户,开始存档过程。再次。这立即解决了我的问题。


0

还有一种解决方案,因为以上所有内容都不适合我...

User Header Search Paths(我想Header Search Paths可以正常使用)更改为"$(BUILT_PRODUCTS_DIR)/BlocksKit"

背景

在BlockKit中,开发人员在主项目中的标头结构与部署时的结构不同。因此,您不能引用项目中的标题,而必须引用复制到构建目录中的标题。


0

在(Xcode 5)中,我有2个目标,这对我起作用。编辑方案时,在方案编辑器的左窗格中,您将看到[BUILD,RUN,TEST,PROFILE XXX.APP,ANALYZE,ARCHIVE ]在BUILD窗格中,您将看到列表中列出的项目目标。在最右端,您将看到“归档”选择,请确保仅选择一个目标进行归档。

我在项目中选择了两个目标,我只检查了产品中想要的目标,它确实起作用了!


0

我通过在XCode中打开应用程序项目来解决此错误,即。不打开工作区包含应用程序和其他项目/库/框架。

我有2个独立的项目,一个框架或共享库以及一个iOS应用程序,我不得不打开2个不同的XCode窗口,每个窗口都通过直接打开.xcodeproj文件而不是通用的.xcworkspace来预先构建。

作为一个很好的副作用,在执行Clean之后,XCode不再重建每个项目的每个目标,从而缩短了构建时间。

背景:我正在创建一个开源SDK和一个演示iOS应用程序。我都在一个工作区中打开过。在SDK目标上将跳过安装设置为“是”将阻止任何人创建存档,因为它将是空的,因此这不是一个选择。使用Project而不是Public标头会导致归档文件丢失应分发的标头文件,因此也不是一种选择。


0

因为这是因为我在工作区中工作。该项目确实已存档,但不会显示在组织者窗口中。我关闭了工作区,并自行打开了项目。档案已在组织者中打开。希望对您有所帮助。


0

就我而言,我有一个自定义脚本,该脚本将一些临时文件复制到:

${TARGET_BUILD_DIR}/myTempDir

这意味着,在调查了档案以检查其内容之后,我在.app文件旁边找到了myTempDir文件夹。一旦我修改了脚本以将其保存到其他位置,就对事物进行了排序。


0

尝试在Framework projet的Public Headers文件夹路径中设置$(PROJECT_NAME)Headers。您必须先建立Library Target的设置,然后将Public Headers Folder路径编辑为$(PROJECT_NAME)Headers。


0

如果将Xcode 7cocoapods v.0.38.2一起使用。尝试移除copy pod resources从您今天的扩展目标中。

在此处输入图片说明


0

在将OS X命令行工具添加到我的iOS应用程序的项目中后,我遇到了此问题,并且默认情况下,对于命令行工具的目标,“跳过安装”设置为NO。由于您显然无法将OS X二进制文件安装到iOS设备,因此存档默认为通用Xcode存档。将此目标设置为“跳过安装”可解决此问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.