Найден неожиданный код заголовка 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 ответ
Проверьте две вещи для каждого фреймворка:
- Тип Mach-O фреймворка (в настройках сборки цели фреймворка)
- Независимо от того, копируете ли вы фреймворк, помещая его в "Фазы сборки" -> "Внедрить фреймворки" (или "Копировать ресурсы комплекта", как упомянуто. 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 год! ОБНОВЛЕНО
Вот как это сделать:
- Создайте приложение, помеченное как
Embed & Sign
- Как только он будет построен. Идите в то же место и установите
Pods_Runner.framework
кDo Not Embed
.
- Перейдите в Продукт -> Архив -> Отправьте архив, и все будет работать, как ожидалось.
кредиты: 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