Найден неожиданный код заголовка Mach-O: 0x72613c21 в Xcode 7

У меня есть проект Swift, использующий динамический фреймворк ObjC, фреймворк должен был быть связан с моим проектом и встроен в него. Проект работает нормально на устройствах, при отправке в 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

Если я удалю динамический каркас из раздела "Встроенные каркасы" проекта, то он может пройти проверку, но произойдет сбой при запуске на устройствах из-за отсутствующего образа моего динамического каркаса, вы понимаете? Кстати, в динамическом каркасе битовый код отключен, поэтому мой проект также отключает битовый код и не имеет кодового знака.

31 ответ

Проверьте две вещи для каждого фреймворка:

  1. Тип Mach-O фреймворка (в настройках сборки цели фреймворка)

Мачо

  1. Независимо от того, копируете ли вы фреймворк, помещая его в "Фазы сборки" -> "Внедрить фреймворки" (или "Копировать ресурсы комплекта", как упомянуто. Brooks hollar)

Вставить рамки

Если тип платформы Mach-O представляет собой "статическую библиотеку", его не следует помещать в структуры для встраивания; если тип Mach-O является "динамической библиотекой", он должен быть помещен в интегрированные среды.

В моем случае это был SocketRocket, который я добавил вручную, у которого есть и статическая целевая библиотека, и динамическая целевая библиотека с тем же именем фреймворка. После удаления цели статической библиотеки и встраивания только структуры динамической библиотеки проблема исчезает.


Примечание:

Если у вас нет доступа к исходному проекту, вы можете вручную проверить, является ли он динамическим или статическим каркасом, используя этот подход: /questions/10125374/ios-eto-staticheskij-ili-dinamicheskij-frejmvork/10125385#10125385

Я не знаю почему, но почему-то стручки оказались встроенным двоичным файлом. Поэтому мне пришлось удалить его, установить модуль еще раз, и проблема исчезла.

Дважды проверьте этапы сборки -> Копировать ресурсы комплекта для каркаса или другого двоичного файла, которого там не должно быть.

В моем случае это была сторонняя библиотека (Parse), которую я добавил.

В моем случае у меня есть фреймворк, вручную перетащенный в мой проект, и он указан в General->Embedded Binaries, которые вызывают ошибку Found an unexpected Mach-O header code: 0x72613c21, После того как я переехал из Embedded Binaries в Linked Frameworks and Libraries, задача решена.

Если вы (потенциально, но не обязательно) использовали FirebaseSDK (особенно Analytics) и получаете ошибку Mach-O при запуске, архивировании и загрузке, попробуйте следующее:

Добавьте это как сценарий пост-действий сборки .

      rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/FirebaseAnalytics.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/GoogleAppMeasurement.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/FIRAnalyticsConnector.framework"

если вы добавили виджеты и / или другие расширения плагинов, добавьте также эти строки:

      rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/PlugIns/FirebaseAnalytics.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/PlugIns/GoogleAppMeasurement.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/PlugIns/FIRAnalyticsConnector.framework"

Краткое объяснение: приведенная ниже цитата из соответствующего обсуждения в разделе https://github.com/firebase/firebase-ios-sdk/issues/6472 объясняет причину этой проблемы.

... так что прямо сейчас артефакты фреймворка firebase копируются в папку / Frameworks ipa и встраиваются. Сами по себе фреймворки - это статические фреймворки .... Если удалить их из xcarchive вручную, все работает как положено.

В основном многие ответы здесь указывают на правильное направление, но проблема остается, потому что решение состоит в том, чтобы каждый раз удалять нежелательные артефакты. В настоящее время (январь 2021 г.) AFAIK нет другого способа решить эту проблему.

Scheme->Edit Scheme->Archive->Post Action->Click '+' -> New Run Script Action-> вставить ниже код

      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

У меня была такая же проблема. Я сделал пару вещей, и моя проблема ушла. Я считаю, что моя проблема была связана с версией Cocoapods, но вы можете попробовать несколько вещей здесь.

Сначала очистите DerivedData:

1. выключить Xcode

2. Перейдите к./Users/YourFile/Library/Developer/Xcode/DerivedData

3. Удалите все из этой папки

4. Запустите Xcode

5.Build & Clean

Во-вторых, по какой-то причине, с последней версией какао-бобов версии 0.39, я получал следующее предупреждение, когда бежал pod install

[!] The MY_TARTGET цель перекрывает EMBEDDED_CONTENT_CONTAINS_SWIFT настройки сборки, определенные в `Pods/Target Support Files/Pods/Pods.release.xcconfig'. Это может привести к проблемам с установкой CocoaPods

Я снизил рейтинг Cocoapods, удалив все установленные Cocoapods:

sudo gem удалить cocoapods

затем установите старую версию:

sudo gem установить cocoapods -v 0.38.1

Это убрало предупреждение, и я смог удалить ошибку, "неожиданный код заголовка Mach-O: 0x72613c21"

Для меня в Карфагене были тканевые бинарные файлы /usr/local/bin/carthage copy-frameworks запустить скрипт.

После удаления, это решило проблему.

Я использую Xcode Version 9.4.1 (9F2000)

В XCode 11 щелкните файл проекта, выберите цель, затем на вкладке "Общие" разверните "Frameworks, Libraries, and Embedded Content", измените "Embed & Sign" на "Do Not Embed".

Редактировать: это выглядит, чтобы быть исправленным в Xcode 8 Beta 3.

В настоящее время я испытываю эту проблему с Xcode 8 Beta 2 и Swift 3 с чисто быстрыми модулями (которые, кажется, вызывают проблему).

Добавление следующего к моему 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.

Взгляните на эту документацию Apple. Встраивание фреймворков в приложение. Перейдите в раздел " Встроенные статические библиотеки", где они объясняют эту ошибку следующим образом:

Это вызвано размещением статической библиотеки в структуру пакета, которая выглядит как фреймворк; сторонние разработчики фреймворка иногда называют статическую платформу. Поскольку двоичный файл в этих ситуациях является статической библиотекой, приложения не могут встраивать его в комплект приложений.

Они также предоставляют способ исправить:

Вы можете решить эту ошибку, определив статическую структуру и удалив ее из раздела "Встроенные двоичные файлы".

Вы выполняете это, следуя инструкциям в разделе Проверка бинарных связей

2021 год! ОБНОВЛЕНО

Вот как это сделать:

  1. Создайте приложение, помеченное как Embed & Sign

  1. Как только он будет построен. Идите в то же место и установите Pods_Runner.framework к Do Not Embed.

  1. Перейдите в Продукт -> Архив -> Отправьте архив, и все будет работать, как ожидалось.

кредиты: lifenautjoe

Добавление нижеприведенного скрипта в Post-Actions of Archive помогло мне решить эту проблему. Он удаляет статические фреймворки, которые не связаны между собой.

      # 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

В моем случае в xcode 11 я возвращаю проблему, чтобы установить не встраивать в общие -> фреймворки, библиотеки и встроенный контент https://stackru.com/images/ed cac8e93c9719eca8b8d32c776b5d123c3a40ab.png

Удалить их из Embedded Binaries и добавить их в Linked Frameworks and Libaries, затем снова заархивируйте и загрузите в магазин.

Проверяйте и ищите дубликаты фреймворков и библиотек на вкладке " Связать двоичный файл с библиотеками" и " Встроить фреймворки" на вкладке "Фазы сборки" своего проекта.

Только должно быть в одну сторону...

Я столкнулся с этой ошибкой с помощью фреймворка FacebookSDK. Я удалил его из списка интегрированных фреймворков на этапах сборки, и он решил проблему. Проверьте журнал и найдите структуру, вызывающую ошибку, как упоминалось другими.

Я столкнулся с этой проблемой в очень простом проекте Framework. У меня была только одна цель в моем проекте для фреймворка, и он прекрасно работал. Я хотел добавить несколько модульных тестов, поэтому я добавил две новые цели: цель "Пакетное тестирование модулей iOS" и цель "Single View Application" (выступать в качестве хост-приложения для тестов). Однако обе новые цели бросали эту ошибку.

Я обнаружил, что проблема была вызвана настройкой компоновки типа Mach-O для новых целей, для которых установлена ​​Статическая библиотека. Видимо, новые цели наследовали тип Mach-O от родительского проекта. Когда я установил Mach-O Type на правильные настройки ("Bundle" для модульных тестов и "Executable" для хост-приложения), все заработало! Мне также пришлось очистить сборку, удалить производные данные и сбросить симулятор, чтобы получить новые настройки.

В моем случае я выбрал копию при установке и работал у меня

В моем случае это было вызвано изменением сертификата / команды разработчика.

Я начинаю проект с личного Dev Apple ID и к тому времени я изменил его на свой рабочий ID. Когда мы пытаемся экспортировать.xcarchive, то возникает сбой "Match-O header". Ничто из описанного здесь или на других сайтах ничего не меняет.

Когда я возвращаю Team обратно к своему личному идентификатору, в журналах ошибок отображаются отсутствующие файлы.xcent только для нескольких платформ (добавленных последними). Поэтому я запускаю совершенно новый проект, вставляю все исходные файлы и файлы, затем запускаю cocoapod, и все работает, как и ожидалось.

Мой способ исправить это было вернуться к Fabric/Crashlytics установка через Cocoapods вместо причудливой настройки Carthage (которая оказалась глючной).

Учитывая количество времени, которое я потратил на поиск этой проблемы, она была вызвана Cocoapods. Я работал над рабочей областью, в которой были как приложения для 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Хук был локальным для области, в которой я писал его, но это не так! Он фактически превратил все мои целевые конфигурации в статические библиотеки! Это исправило это:

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

Я столкнулся с той же проблемой несколько дней назад, основная причина этой проблемы:

** Некоторые статические библиотеки были ошибочно встроены в пакет .app. **

Вы можете искать .a или static .framework в пакете приложений Products/ *. В Xcode и внимательно проверять проект, удаляя избыточные статические библиотеки.

Майк из ткани здесь.

Это была ошибка в Xcode Beta 2 и 3, она была исправлена ​​в Beta 4, и обновление до последней версии устранит ее.

Если у вас есть проект Xcode для статической структуры, ваша тестовая цель должна иметь значение "Bundle" для параметра сборки MACH_O_TYPE:

ht tps:https://stackru.com/images/90ac70a1bfd13efd314ff097fb736955adb47f5a.png

У меня была эта проблема с добавленной вручную платформой PFFacebookUtils в проекте Swift 2.3, не относящемся к CocoaPods. Я исправил это, удалив указанный фреймворк из раздела "Встроенные фреймворки" на странице "Общие" цели сборки и связал его в Этапы сборки -> Связать двоичные файлы с библиотеками

При встраивании пакетов из целевых библиотек они могут создавать исполняемые файлы даже с Mach-O Type = Bundle. Таким образом, мы можем просто удалить эти исполняемые файлы изxcarchive(Продукты / Приложения / APP_NAME / YourBundle.bundle / YourBundle)

Используйте этот код как этап сборки сценария вместо действия после сборки схемы. Я выяснил из всех ответов, что это работает лучше всего:

      # 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

Если вы используете Firebase и Xcode 12.4, это может быть проблемой . Лучшее решение - добавить этап выполнения сценария со следующим:

      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

Одна из возможных причин - вложенный фреймворк.

Вдохновленный 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
Другие вопросы по тегам