在Xcode 7中找到了一个意外的Mach-O头代码:0x72613c21

时间:2015-10-12 08:46:10

标签: validation dynamic frameworks store

我有一个使用ObjC动态框架的Swift项目,该框架必须与我的项目链接并嵌入到我的项目中。项目在设备中运行正常,当提交到App Store时,验证期间发生错误: Found an unexpected Mach-O header code: 0x72613c21

以下是验证日志:

2015-10-12 02:32:33 +0000 [MT] Beginning distribution assistant for archive: MusicFans, task: Validate
2015-10-12 02:32:33 +0000 [MT] Automatically selecting the only availaable distribution method <IDEDistributionMethodiOSAppStoreValidation: 0x7f851c1d96c0>
2015-10-12 02:32:34 +0000 [MT] [OPTIONAL] Didn't find archived user entitlements for <DVTFilePath:0x7f851b42db10:'/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/Frameworks/libswiftDispatch.dylib'>: Error Domain=NSCocoaErrorDomain Code=4 "Item at "/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/Frameworks/libswiftDispatch.dylib" did not contain a "archived-expanded-entitlements.xcent" resource." UserInfo={NSLocalizedDescription=Item at "/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/Frameworks/libswiftDispatch.dylib" did not contain a "archived-expanded-entitlements.xcent" resource.}
2015-10-12 02:32:34 +0000 [MT] [OPTIONAL] Didn't find archived user entitlements for <DVTFilePath:0x7f8529a08050:'/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/wavpack.framework'>: Error Domain=NSCocoaErrorDomain Code=4 "Item at "/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/wavpack.framework" did not contain a "archived-expanded-entitlements.xcent" resource." UserInfo={NSLocalizedDescription=Item at "/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/wavpack.framework" did not contain a "archived-expanded-entitlements.xcent" resource.}
2015-10-12 02:32:34 +0000 [MT] [OPTIONAL] Didn't find archived user entitlements for <DVTFilePath:0x7f850da13de0:'/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/FLAC.framework'>: Error Domain=NSCocoaErrorDomain Code=4 "Item at "/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/FLAC.framework" did not contain a "archived-expanded-entitlements.xcent" resource." UserInfo={NSLocalizedDescription=Item at "/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/FLAC.framework" did not contain a "archived-expanded-entitlements.xcent" resource.}
2015-10-12 02:33:07 +0000 [MT] Canceled distribution assistant

如果我从项目的嵌入式框架部分中删除动态框架,那么它可以通过验证,但由于我的动态框架缺少图像而在设备中运行时崩溃,任何想法? BTW,动态框架禁用了bitcode,因此我的项目也禁用了bitcode,并且没有进行编码。

28 个答案:

答案 0 :(得分:36)

检查每个框架的两件事:

  1. 框架的Mach-O类型(在框架目标的构建设置中)
  2. Mach-O

    1. 是否通过将其置于Build Phases中来复制框架 - &gt;嵌入框架(或复制捆绑资源,如.brooks hollar所述)
    2. Embed frameworks

      如果框架的Mach-O类型是&#34;静态库&#34;,它应该放入嵌入框架中;如果Mach-O类型是&#34;动态库&#34;,它应该放入嵌入框架。

      在我的例子中,我手动添加了SocketRocket,它既有静态库目标又有动态库目标,具有相同的框架名称。删除静态库目标并仅嵌入动态库框架后,问题就消失了。

      注意

      如果您无法访问源项目,则可以使用此方法手动检查它是动态还是静态框架:https://stackoverflow.com/a/32591983/308315

答案 1 :(得分:14)

在我的情况下,我手动将框架拖入我的项目,它列在General - &gt; Embedded Binaries中,导致错误Found an unexpected Mach-O header code: 0x72613c21。我将其从Embedded Binaries移至Linked Frameworks and Libraries后,问题就解决了。

答案 2 :(得分:8)

我有同样的问题。我做了几件事,我的问题就消失了。我相信我的问题与Cocoapods版本有关,但你可以在这里尝试几件事。

首先清理DerivedData:

  

1.关闭Xcode

     

2.转到./Users/YourFile/Library/Developer/Xcode/DerivedData

     

3.删除此文件夹中的所有内容

     

4.Run Xcode

     

5.Build&安培;清洁

第二个由于某种原因,最新的可可豆荚版本为0.39,当我跑pod install

时,我收到了警告
  

[!] MY_TARTGET目标覆盖`Pods / Target Support Files / Pods / Pods.release.xcconfig&#39;中定义的EMBEDDED_CONTENT_CONTAINS_SWIFT构建设置。这可能会导致CocoaPods安装出现问题

我已删除所有已安装的cocoapods降级了cocoapods:

  

sudo gem uninstall cocoapods

然后安装旧版本:

  

sudo gem install cocoapods -v 0.38.1

这删除了警告,我能够删除错误,&#34;意外的Mach-O标头代码:0x72613c21&#34;

答案 3 :(得分:6)

修改:这似乎在Xcode 8 Beta 3中得到修复。

我目前正在使用Xcode 8 Beta 2和Swift 3使用纯swift Pod(这似乎导致了这个问题)遇到了这个问题。

将以下内容添加到我的Podfile中解决了这个问题。

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'NO'
    end
  end
end

YuAo在GitHub上转到this comment

答案 4 :(得分:5)

Scheme->Edit Scheme->Archive->Post Action->Click '+' -> New Run Script Action-> 粘贴下面的代码

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

project.ext.envConfigFiles = [
        developmentdebug: ".env",
        developmentrelease: ".env",
        productiondebug: ".env",
        productionrelease: ".env",
]

apply from: project(':flutter_config').projectDir.getPath() + "/dotenv.gradle"


android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    lintOptions {
        disable 'InvalidPackage'
        checkReleaseBuilds false
        abortOnError false
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "<App-ID>"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword']
        }
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            signingConfig signingConfigs.release
            useProguard true
            minifyEnabled true

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            // TODO: Add your own signing config for the release build.
            signingConfig signingConfigs.debug
            useProguard true
            minifyEnabled true

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation platform('com.google.firebase:firebase-bom:26.1.0')
    implementation 'com.google.firebase:firebase-analytics'
}

apply plugin: 'com.google.gms.google-services'

enter image description here

答案 5 :(得分:5)

在XCode 11中,单击项目文件,选择目标,然后在“常规”选项卡上,展开“框架,库和嵌入式内容”,将“嵌入和签名”更改为“不嵌入”。

答案 6 :(得分:4)

2021!更新

这里有一个技巧:

  1. 使用标记为 Pods_Runner.frameworkEmbed & Sign 构建应用

enter image description here

  1. 一旦建成。转到同一个地方并将 Pods_Runner.framework 设置为 Do Not Embed

enter image description here

  1. 转到“产品”->“存档”->“提交存档”,一切都会按预期工作。

学分:lifenautjoe

答案 7 :(得分:4)

Embedded Binaries移除它们并将其添加到Linked Frameworks and Libaries,然后再次存档并上传到商店。

答案 8 :(得分:4)

对我来说,我在迦太基/usr/local/bin/carthage copy-frameworks运行脚本中有Fabric二进制文件。

删除这些内容后,它解决了该问题。

我正在使用Xcode Version 9.4.1 (9F2000)

答案 9 :(得分:3)

将以下脚本添加到 ArchivePost-Actions 帮助我克服了这个问题。它删除了不相关的静态框架。

# https://github.com/firebase/firebase-ios-sdk/issues/6472
LOGFILE="${ARCHIVE_PATH}/static-frameworks.log"
echo "Removing static frameworks from ${WRAPPER_NAME} archive" > $LOGFILE
find "${ARCHIVE_PRODUCTS_PATH}/Applications/${WRAPPER_NAME}" -name '*.framework' -print0 | while IFS= read -r -d '' fm; do
    name=$(basename "${fm}" .framework)
    target="${fm}/${name}"
    echo "Checking: ${fm}" >> $LOGFILE
    if file "${target}" | grep -q "current ar archive"; then
        rm -rf "${fm}"
        echo "Removed static framework: ${fm}" >> $LOGFILE
    fi
done

来自 Firebase 问题的评论:https://github.com/firebase/firebase-ios-sdk/issues/6472#issuecomment-771351512

答案 10 :(得分:3)

我不知道为什么但不知何故pod似乎成为嵌入式二进制文件。所以我不得不删除它,再次安装pod,问题就消失了。

enter image description here

答案 11 :(得分:3)

请查看此 Apple 文档 Embedding Frameworks in An App转到嵌入式静态库部分,他们会解释此错误:

  

这是通过将静态库放在看起来像框架的bundle结构中引起的;这种包装有时被第三方框架开发人员称为静态框架。由于这些情况下的二进制文件是静态库,因此应用程序无法将其嵌入到应用程序包中。

他们还提供了一种修复方法:

  

您可以通过识别静态框架并将其从嵌入式二进制文件部分中删除来解决此错误。

您可以按照Inspecting A Binary's Linkage

中的说明完成此操作

答案 12 :(得分:3)

在项目的“构建阶段”标签中的与库链接二进制文件嵌入框架中检查并查找重复的框架和库。

只能在一侧...

答案 13 :(得分:1)

在我的情况下,它是由开发人员证书/团队的更改引起的。

我使用个人Dev Apple ID启动项目,当我将其更改为我的工作ID时。 当我们尝试导出.xcarchive时,会出现“Match-O header”失败。 此处或其他网站上描述的任何内容都不会改变任何内容。

当我将Team更改回我的个人ID时,错误日志显示现在只有少数框架(最近添加)的.xcent文件丢失。所以我开始全新的项目,粘贴所有的源代码和文件,然后运行cocoapod,一切都按预期工作。

答案 14 :(得分:1)

就我而言,我在安装时选择了副本并为我工作

enter image description here

答案 15 :(得分:1)

就我在xcode 11中的情况而言,我想解决的问题是未将其设置为一般->框架,库和嵌入式内容enter image description here

答案 16 :(得分:1)

我要解决此问题的方法是通过Cocoapods重新进行Fabric/Crashlytics安装,而不是花哨的迦太基设置(看来是越野车)。

答案 17 :(得分:1)

我用FacebookSDK框架遇到了这个错误。我从Build Phases的Embed框架列表中删除了它,它解决了这个问题。检查日志并找到导致其他人提到的错误的框架。

答案 18 :(得分:0)

鉴于我花了很多时间去发现这个问题,这是由可可足类引起的。我当时在一个工作区中工作,该工作区既有iOS应用程序又有一个命令行工具来启动一些管道和内容。我的文件看起来像这样:

target 'AppPipe' do
  platform :osx, '10.14'
  project 'AppPipe/AppPipe.xcodeproj'
  pod 'Yams'

  post_install do |installer|
    installer.pods_project.targets.each do |target|
      target.build_configurations.each do |config|
        config.build_settings['MACH_O_TYPE'] = 'staticlib'
      end
    end
  end
end

我认为pods_install挂钩对于我在其中编写的作用域而言是本地的,但事实并非如此!实际上,它把我所有目标的配置都变成了staticlibs!这样就解决了:

target 'AppPipe' do
  platform :osx, '10.14'
  project 'AppPipe/AppPipe.xcodeproj'
  pod 'Yams'
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
        # Only AppPipe always gets staticlib
        if target.name == 'AppPipe'
          config.build_settings['MACH_O_TYPE'] = 'staticlib'
        end
    end
  end
end

答案 19 :(得分:0)

如果您有用于静态框架的Xcode项目,则测试目标的MACH_O_TYPE构建设置必须具有“捆绑”值:

enter image description here

答案 20 :(得分:0)

从库目标嵌入包时,即使使用Mach-O Type = Bundle,它们也可能会生成可执行文件。因此,我们只需从xcarchive产品/应用程序/APP_NAME/YourBundle.bundle/YourBundle

中删除这些可执行文件即可。

答案 21 :(得分:0)

我在一个非常简单的Framework项目中遇到了这个问题。我的项目框架中只有一个目标,它正在构建良好。我想添加一些单元测试,因此我添加了两个新目标:iOS单元测试捆绑目标和单视图应用程序目标(充当测试的主机应用程序)。但是,这两个新目标都抛出了这个错误。

我发现问题是由新目标上的Mach-O Type构建设置设置为静态库引起的。显然,新目标是从父项目继承Mach-O类型。当我将Mach-O类型设置为正确的设置时(&#34; Bundle&#34;用于单元测试和&#34;可执行文件&#34;用于主机应用程序)这一切都有效!我还必须清理构建,删除派生数据并重置模拟器以获取新设置。

答案 22 :(得分:0)

我在Swift 2.3非CocoaPods项目中手动添加PFFacebookUtils框架时出现此问题。我通过从构建目标的“常规”页面的嵌入式框架部分中删除所述框架来修复它,并将其链接到构建阶段 - &gt;链接二进制文件库

答案 23 :(得分:0)

来自Fabric的Mike。

这是Xcode Beta 2和3中的一个错误,已在Beta 4中修复,更新到最新版本将解决它。

答案 24 :(得分:0)

将此代码用作脚本构建阶段而不是方案构建后操作。我在所有答案中都找到了,这是最好的:

# Fixes binary framework bug, see:
# https://developer.apple.com/documentation/xcode-release-notes/xcode-12_4-release-notes#Swift-Packages
# https://github.com/firebase/firebase-ios-sdk/issues/6472

echo "Removing static frameworks from ${TARGET_NAME}.app"
find "${BUILT_PRODUCTS_DIR}/${TARGET_NAME}.app/" -name '*.framework' -print0 | while IFS= read -r -d '' fm; do
    name=$(basename "${fm}" .framework)
    target="${fm}/${name}"
    echo "Checking: ${fm}"
    if file "${target}" | grep -q "current ar archive"; then
        rm -rf "${fm}"
        echo "Removed static framework: ${fm}"
    fi
done

答案 25 :(得分:0)

我前几天遇到了同样的问题,这个问题的根本原因是:

** 一些静态库被错误地嵌入到 .app 包中。 **

您可以在Xcode的Products/*.app bundle中搜索.a或static .framework,仔细查看项目,去除多余的静态库。

答案 26 :(得分:-1)

可能的原因之一是嵌套框架。

受Golang的启发,我最近从以下位置重构了项目代码:

App(with all the code in one target)

to(“->”表示与之链接,ABCD表示框架)

B -> C
A -> B

App -> A
App -> B
App -> C

事实证明,Apple并未正式支持嵌套框架。所以我不得不将依赖关系树展平为:

App -> D

D -> A
D -> B
D -> C

答案 27 :(得分:-2)

我在Xcode 8 beta 3中遇到了同样的问题。我修复了它从Linked框架中移除Fabric和Crashlytics(Project =&gt; Target =&gt; General page)(source