无法在 xcode 中生成 iOS App 存档

Posted

技术标签:

【中文标题】无法在 xcode 中生成 iOS App 存档【英文标题】:Cannot generate iOS App archive in xcode 【发布时间】:2012-05-23 07:20:25 【问题描述】:

我在从应用程序生成 ios 应用程序存档时遇到问题。该应用程序编译得很好,甚至可以在模拟器中运行。现在我想做一些临时测试并且无法生成 iOS App Archive。当我单击 Product -> Archive 时,它​​会生成一个通用的 xcode 存档。谁能帮我。我应该提一下,我已经生成了这个应用程序的 iOS App Archive。由于某种原因,它刚刚停止生成 iOS 存档。非常感谢。

【问题讨论】:

尽管问题是关于从 xcode 生成存档,但我使用xcodebuild 遇到了这个问题。解决方案是指定目的地:xcodebuild -destination generic/platform=iOS 感谢@db42,成功了! 您能否详细说明一下解决方案-您在哪里进行更改? 如果您在 Project>Targets>Build Phases>target dependencies 中有任何 .xcodeproj 文件,请将其从那里删除,然后构建您的 ipa。这个对我有用。干杯 【参考方案1】:

检查构建设置:

    对于主要项目目标来说,跳过安装是 NO 框架(子项目)目标的跳过安装是 YES 在子项目的 Build Phases 中,Copy Headers 需要在 Project 中,而不是 Public (如果构建静态库则不适用) Deployment 下的安装目录有效(例如 /Applications)

【讨论】:

这是包含上述部分答案的最完整答案。谢谢亚历克斯 L!我认为这应该是这个问题的选择答案。 作为一个元问题,您是如何解决这个问题的?似乎我依赖 *** 解决所有与构建相关的问题。 漂亮!我认为这是配置文件的问题,但这很好用。子项目是 route-me/MapView 的 mapbox 分支。 Copy Headers 是关键,因为下面的帖子指出,它可以在子项目的 Build Phases 中找到。 #3 解决了我的问题,但我还需要将文件从 Private 移动到 Project,然后才能将我的存档构建为 iOS App Archive。 从技术上讲,问题不在于复制标题下的标题是公共的,而是构建设置>公共标题文件夹路径设置为默认的/usr/local/include。如果您正在构建一个静态库,则标题必须是公共的,因此如果#3 将公共标题文件夹路径更改为更合理的内容,例如include/$(TARGET_NAME),则更正确。 @CopperCash 在下面的答案中指出了这一点。【参考方案2】:

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

【讨论】:

但是“跳过安装”在 xcode 4.4.1 中不可用,至少我无法在我的 xcode 中找到跳过安装 这同样适用于添加的捆绑包。【参考方案3】:

除了 Skip InstallYes 之外,如果您在应用项目中打开了另一个 lib/framwork 项目,您必须从 public项目构建阶段 / 复制标题

【讨论】:

我快要失去希望了,因为 Skip Install to Yes 对我不起作用。将标题复制到 Project 对我有用。谢谢! 为了帮助您定位有问题的 Xcode 子项目,您可以在 Finder 中显示 Generic Xcode Archive 并浏览该包。在 .xcarchive 中,您将在 Products/usr/local/include 中看到错误的标头。 为什么要把一些文件复制到公开的标题上搞砸了? mskw,我猜如果构建的工件包含一个或多个公共标头,它就不能成为“设备可部署”存档(iOS App Archive 从中生成 IPA)。它仍然是一个 Xcode 项目存档。谢谢 该死的,谢谢,这对我有用。我想知道你到底是怎么找到这些解决方案的 :)【参考方案4】:

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

    我有一个three20静态库,我使用cocoapods将文件包含在主项目中 按照上述所有其他子项目/静态库的跳过安装并将复制标头从公共切换到项目 最重要的是:在您的项目使用的每个库中转到构建阶段 -> 复制文件 并确保 destinationAbsolute path 更改为 @ 987654325@。注意:请参阅下面的提示以缩小搜索范围以找到导致此错误的库。

就是这样!

提示:要了解导致存档创建存档文件而不是 ipa 的违规文件,请执行以下操作:

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

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

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

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

【讨论】:

很好的提示!我已将一些框架标题更改为“私有”;出于某种原因,这导致它们被复制到./usr/local/include 能够帮助@BenMosher 总是很高兴:) 我得到的最佳答案。感谢您的提示,挽救了我的一天。 ! 绝对是我正在寻找的答案——保存构建产品指出了问题的确切原因。 这个关于“保存已建产品”的广泛回答非常有帮助 - @abbood,非常感谢你。希望有一天我能回报你的恩惠。【参考方案5】:

如果您导出存档,打开它并在 Products 中查看/urs/local/include 尝试this suggestion:

在每个 pod 中,PackagingPrivate Headers Folder PathPublic Headers Folder Path 下设置为 /usr/local/include。如果我清除它们,那么我会得到一个有效的存档。

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

【讨论】:

我可以确认这行得通!只要您记得清除私有和公共标头路径。也很简单,如果你只选择所有的pod,搜索header路径,然后同时清除它们。 我还可以确认这是可行的,节省了我很多时间,当我将我的 pod 升级到 0.39.0.beta 版本时发生这种情况 太棒了。为我工作:) 我从 1 天半开始苦苦挣扎。谢谢,谢谢,谢谢:) :) :) 我认为这是对我有用的 Xcode 7.0 iOS9。我没有任何 cocoapods,但这仍然解决了这个问题。谢谢大佬 除此之外,我必须在我的 WatchKit 扩展程序和应用程序上将 SKIP_INSTALL 设置为 Yes 才能正常工作。【参考方案6】:

如果您正在使用 CocoaPods 以及 WatchKit 或 Today Extension,在 CocoaPods 存储库中有一个开放的issue 解释您的问题可能是什么。

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

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

【讨论】:

@Lewis42 总是可以增加赏金;) 看不到选项,必须对您的评论投赞成票;) @Lewis42 您必须将赏金添加到问题中并将其奖励给答案,哈哈 @rebello95,你这个摇滚老兄!【参考方案7】:

如果上述任何答案都不起作用,则您的问题可能与cocoaPods 有关。最新的更新0.38.1 让我搞砸了,但后来我降级到0.37.1,一切又恢复了正常。使用Xcode 6.3.1

稍后编辑:更新到 0.38.2 也将解决此问题。有关导致此问题的原因的更多信息:Cocoapods 0.38.1 failed to create valid Archive

【讨论】:

我更新到0.38.2 仍然有问题。你在 Xcode 7 上吗? @PorterHoskins 我刚刚将这个问题写成Xcode 7 will NOT build a valid Archive from the same project that builds a valid archive in Xcode 6。我正在使用 Cocoa Pods 0.38.2,当使用 Xcode 6 时一切正常,但使用 Xcode 7 时,无法正确创建存档。你检查过你的文件夹结构,看看你的包中的 .app 之外是否有一个 .appex 文件? 我在/Library/Frameworks 有一个框架。我认为这可能与 Google 的可可豆荚没有被构建为动态框架有关。听起来类似于github.com/CocoaPods/CocoaPods/issues/3889 我将 Build Phases/Headers 中的每个 pod headers 都从 public 移到了 project 部分,它工作正常。所以确实问题可能出在 CocoaPods 中。【参考方案8】:

虽然我使用的是 Xcode5,并且为我排序的是编辑构建方案 - 尝试所有适用的上述建议对我的情况没有帮助。

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

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

【讨论】:

【参考方案9】:

如果您只有一个项目,也许这个解决方案会很有用。 当我复制目标时,出现了这个问题。结果,我有两个并行构建的目标。这导致了这个问题。通用 IOS 存档已构建。

要关闭并行构建,请转到

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

【讨论】:

【参考方案10】:

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

在每个 pod 中,在 Packaging、Private Headers 文件夹路径和 Public 下 标头文件夹路径设置为 /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

【讨论】:

【参考方案11】:

我遇到了这个问题。在我的情况下,这是由于将 Mac 应用程序目标保留为 iOS 应用程序的依赖项。

这样设置的原因是 Mac 应用程序是一个用于为 iOS 应用程序生成一些数据的工具,然后将其包含在捆绑包中。

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

【讨论】:

lippd 等库同时带有 ios 和 osx 目标,我忘了删除 osx 目标... doh【参考方案12】:

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

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

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

【讨论】:

【参考方案13】:

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

选择项目,那里会有两种类型,一个是项目,一个是Targets

对于不是您的主要项目,例如 GTLPODS

项目:

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 部署目标,确保它们都相同。

【讨论】:

感谢您逐步解释。这真的帮助我解决了我的问题。【参考方案14】:

把它留在这里是为了让其他人免于同样的旅程。

我发现我也需要从我的工作区中的静态库目标中删除相同的 Copy Pod Resources 构建阶段。

【讨论】:

在尝试了上面的很多东西之后,这对我有用(Xcode 7)【参考方案15】:

除了 Alex L 的回答。

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

【讨论】:

这比上面的#3 更正确。如果您正在构建静态库,则您的标题需要公开【参考方案16】:

如果以上都没有帮助你...经过很长时间......

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

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

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

【讨论】:

【参考方案17】:

    转到构建设置并添加

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

    cmd + B 并选择 iOS 设备真实设备 作为构建目标

    完成后 -> 滚动到“Products”文件夹并右键单击 yourAppName.app

    选择“在 Finder 中显示”

    创建一个名称为Payload大写“P”)的文件夹

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

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

    重命名压缩包到 yourAppName.ipa

完成

【讨论】:

【参考方案18】:

尝试了几乎所有方法之后:

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

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

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

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

【讨论】:

【参考方案19】:

如果您在 Project>Targets>Build Phases>target dependencies 中有任何 .xcodeproj 文件,请将其从那里删除,然后构建您的 ipa。这个对我有用。干杯

你可以在这里得到答案:xcode is creating generic xcode archive instead of iOS App Archive

【讨论】:

【参考方案20】:

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

【讨论】:

【参考方案21】:

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

【讨论】:

【参考方案22】:

为了彻底,我发布了我的解决方案。

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

在我的情况下,解决问题包括简单地关闭我的项目,删除我之前制作的所有存档,转到 Preferences > Accounts,删除我的开发者帐户,退出 Xcode,重新启动,重新添加我的开发者帐户,开始再次归档过程。这立即解决了我的问题。

【讨论】:

【参考方案23】:

还有一个解决方案,因为以上所有方法都不适合我...

User Header Search Paths(我想Header Search Paths 也可以优雅地工作)更改为"$(BUILT_PRODUCTS_DIR)/BlocksKit"

背景

在 BlockKit 中,开发人员在主项目中的标头结构与部署结构不同。所以,你不能引用项目中的头文件,必须引用复制到构建目录中的头文件。

【讨论】:

【参考方案24】:

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

我在我的项目中选择了 2 个目标,我只检查了我想要在产品中使用的目标,它成功了!

【讨论】:

【参考方案25】:

我通过在 XCode 中只打开应用程序项目解决了这个错误,即。 未打开包含应用程序和其他项目/库/框架的工作区

有 2 个独立的项目、一个框架或共享库和一个 iOS 应用程序,我必须打开 2 个不同的 XCode 窗口,每个窗口都直接打开 .xcodeproj 文件而不是常见的 。 xcworkspace,以便预先构建每个。

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

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

【讨论】:

【参考方案26】:

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

【讨论】:

【参考方案27】:

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

$TARGET_BUILD_DIR/myTempDir

这意味着,在调查存档以检查其内容后,我在 .app 文件旁边发现了一个 myTempDir 文件夹。一旦我修改了脚本以保存其他地方,事情就被排序了。

【讨论】:

【参考方案28】:

尝试在 Framework projet 的 Public Headers 文件夹路径中设置 $(PROJECT_NAME)Headers。您必须去构建库目标的设置,然后将公共标题文件夹路径编辑为 $(PROJECT_NAME)Headers。

【讨论】:

【参考方案29】:

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

【讨论】:

【参考方案30】:

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

【讨论】:

以上是关于无法在 xcode 中生成 iOS App 存档的主要内容,如果未能解决你的问题,请参考以下文章

无法在 ios 6 中创建存档文件

如何在 XCode 中生成 iOS 13 SwiftUI 项目?

使用 Xcode 生成 .IPA

iOS开发最最基础之打包应用并发布到App Store

无法存档更新的 iOS PhoneGap 应用程序

在 Xcode 中生成 AdHoc Phonegap iOS Testflight 时下载失败