Невозможно создать архив приложения iOS в xcode

175

У меня проблема с созданием архива приложения для iOS из приложения. Приложение прекрасно компилируется и даже работает в симуляторе. Теперь я хотел провести специальное тестирование и не могу сгенерировать архив приложений для iOS. Когда я нажимаю на Product -> Archive, он генерирует общий архив xcode. Может кто-нибудь помочь мне. Я должен упомянуть, что я уже создал iOS App Archive этого приложения. По какой-то причине он просто прекратил генерировать iOS Archive. Большое спасибо.

Филип Майерник
источник
7
Хотя вопрос заключается в создании архива из xcode, я столкнулся с этой проблемой, используя xcodebuild. Решение состоит в том, чтобы указать пункт назначения:xcodebuild -destination generic/platform=iOS
db42
Спасибо @ db42, что сделал это!
Fabb
1
Можете ли вы уточнить резолюцию - где вы вносите изменения?
jlo-gmail
Если у вас есть файлы .xcodeproj в Project> Targets> Build Phases> target target, удалите их оттуда и затем соберите свой ipa. Меня устраивает. Приветствия
Kalpesh Panchasara

Ответы:

316

Проверьте настройки сборки:

  1. Пропустить установку НЕТ для основной цели проекта
  2. Пропустить установку - ДА для целевых структур (подпроектов)
  3. На этапах сборки для подпроектов, заголовки копирования должны быть в Project, а не в Public (не применяется при сборке статической библиотеки)
  4. Каталог установки в разделе Развертывание действителен (/ Приложения, например)
Алекс Л
источник
2
Это наиболее полный ответ, который включает в себя приведенные выше частичные ответы. Спасибо Алекс Л! Я думаю, что это должен быть выбранный ответ на этот вопрос.
Брэндон
3
В качестве мета-вопроса, как вы это выяснили? Похоже, я полагаюсь на Stackoverflow для всех моих вопросов, связанных со сборкой.
philipkd
4
Прекрасный! Я думал, что это проблема с настройкой профилей, но это работало отлично. Подпроект был mapbox веткой route-me / MapView. Копия заголовков была ключевой, как указано в сообщении ниже, его можно найти на этапах сборки подпроекта.
rcarver
7
# 3 исправил мою проблему, но мне также нужно было переместить файлы из частного в проект, прежде чем мой архив был создан как архив приложений для iOS.
Томас Хайчак
4
Технически, проблема не в том, что заголовки являются общедоступными в разделе «Копировать заголовки», а в том, что «Параметры сборки»> «Путь к общедоступным заголовкам» установлены по умолчанию /usr/local/include. Если вы создаете статическую библиотеку, заголовки должны быть общедоступными, поэтому правильнее будет, если № 3 изменит путь к общедоступной папке заголовков на что-то более разумное include/$(TARGET_NAME). @CopperCash отмечает это в ответе ниже.
скот
75

Это может произойти, если вы добавили фреймворк / библиотеку ... вам нужно отредактировать Target-> Build Settings этой библиотеки и установить для параметра «Пропустить установку» значение «Да». При повторном архивировании XCode должен снова начать создавать «Архив приложений iOS», а не «общий архив xcode».

Делани
источник
но «Пропустить Установка» не доступен в Xcode 4.4.1, по крайней мере , я не смог найти пропустить intall в моей Xcode
Машхади
2
То же самое относится и к добавленным пакетам.
Марк Хорган
62

В дополнение к « Пропустить установку» в « Да» и в случае, если вы открыли другой проект lib / framwork в своем проекте приложения, вы должны переместить заголовки (если они есть) из общедоступного в проект в фазе сборки / копирования заголовков .

фаза сборки вашей цели lib / framwork

ebtokyo
источник
3
Я как раз собирался потерять надежду, так как Skip Install to Yes не сработал для меня. Копирование заголовков в Project помогло мне. Спасибо!
КСМ
10
Чтобы помочь вам локализовать неисправный подпроект XCode, вы можете показать общий архив XCode в Finder и исследовать пакет. Внутри .xcarchive вы увидите ошибочные заголовки в Products / usr / local / include.
MonsieurDart
1
Зачем помещать несколько файлов для копирования заголовков в публичный код?
Mskw
mskw, я полагаю, что если созданный артефакт содержит один или несколько общедоступных заголовков, он не может стать архивом "развертываемого устройства" (Архив приложений iOS, из которого создается IPA). Это остается архивом проекта XCode. Спасибо
ebtokyo
1
блин, спасибо, это сработало для меня .. Интересно, как, черт возьми, вам удается находить подобные решения :)
Фабио Наподано,
45

Я сделал следующее, чтобы это работало на меня:

  1. У меня была статическая библиотека Three20, я использовал cocoapods для включения файлов в основной проект
  2. выполнил установку пропуска для всех других подпроектов / статических библиотек и переключил заголовки копирования с публичного на проект, как указано выше
  3. самое главное: в каждой библиотеке, которую использует ваш проект, перейдите к этапам сборки -> Копировать файлы и убедитесь, что место назначения изменилось с Absolute pathна products directory. Примечание: см. Подсказку ниже, чтобы сузить область поиска, чтобы найти библиотеку, вызывающую эту ошибку.

и это было все!

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

  1. Выберите архив и нажмите кнопку «Распространить».
  2. Выберите «Сохранить встроенные продукты».
  3. Нажмите Далее и Сохранить.
  4. Просмотрите созданный каталог в Finder.
  5. Подкаталог 'библиотеки' будет определять библиотеки, которые вам нужны, чтобы установить для Пропуск установки значение Да.
  6. в некоторых случаях usr/local/includeбудут определены файлы заголовков виновника, которые вам нужно переместить из Public в Project, или файлы, которые вы должны изменить с абсолютного пути к каталогу продуктов (или даже файлы, которые вы забыли установить для флага установки пропуска, установив yes). но этот каталог (например, usr / local / include) варьируется в зависимости от структуры вашей библиотеки. Во многих случаях ... вы увидите все файлы, перечисленные в разделе « Копировать файлы» в шаге 3, перечисленные здесь. Если вы найдете их здесь, то у вас есть определенный ответ на причину вашей проблемы.

обновите до подсказки: чтобы сделать жизнь еще проще ... какие бы файлы ни появлялись на шаге 4 в подсказке выше ... просто найдите их в глобальном поиске xcode .. и вы должны получить немедленные результаты для того, что вы хотите ... например, это было содержимое моей папки (следуя инструкциям выше):

введите описание изображения здесь

Так что я могу сказать, что это как-то связано с библиотеками crypto и ssl .

введите описание изображения здесь

заставил меня понять, что я забыл установить пропустить установку на да.

abbood
источник
Отличный намек! Я изменил некоторые заголовки фреймворка на «Private»; по какой-то причине это было причиной их копирования ./usr/local/include.
Бен Мошер
1
всегда приятно быть в состоянии помочь @BenMosher :)
abbood
1
Лучший ответ, который я получил. Спасибо за совет, спас мой день. !
Нейвен
Определенный ответ, который я искал - сохранение продуктов сборки указывало на точную причину проблемы.
Деннис Л
Этот обширный ответ с «Сохранить встроенные продукты» очень полезен - @abbood, огромное спасибо вам. Надеюсь, я смогу вернуть услугу когда-нибудь.
Скотт Корскэдден
21

Если вы экспортируете архив, откройте его и посмотрите /urs/local/includeв разделе Продукты попробуйте следующее :

В каждом из стручка, под Packaging, Private Headers Folder Pathи Public Headers Folder Pathустанавливается в /usr/local/include. Если я их уберу, то получу действительный архив.

введите описание изображения здесь

Работал на меня после обновления моего приложения 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. У меня нет кокапод, но это решило проблему. Спасибо человек
Джефф Х
В дополнение к этому, я должен был установить для SKIP_INSTALL значение Yes в моем расширении WatchKit и в приложении, чтобы это работало.
Снеговик
12

Если вы используете CocoaPods, а также WatchKit или расширение для Today, существует открытая проблема в репо CocoaPods, объясняющая, в чем может быть ваша проблема.

Решение для меня , чтобы удалить Copy Pod Resourcesфазы от WatchKit расширения и сегодня Удлинитель цели под Build Phases. Проект скомпилирован и заархивирован, как и ожидалось, когда я это сделал

Надеюсь, это поможет кому-то, это поставило меня в тупик на целый день!

rebello95
источник
1
@ Lewis42 всегда может добавить награду;)
rebello95
Не вижу варианта, голосование за ваш комментарий должно будет подойти;)
Льюис
@ Lewis42, тебе нужно добавить награду к вопросу и наградить ее ответом.
Lol
@ 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 архив создается неправильно. Вы проверили структуру своей папки, чтобы увидеть, есть ли у вас файл .appex вне вашего .app в пакете?
Белый медведь
У меня есть рамки в /Library/Frameworks. Я думаю, что это может иметь какое-то отношение к тому, что какао-бобы Google не создавались как динамическая структура. Это похоже на github.com/CocoaPods/CocoaPods/issues/3889
Портер Хоскинс
3
Я перешел для каждого заголовка модуля в фазах сборки / заголовках в публичный раздел проекта, и это сработало. Так что действительно проблема может быть в CocoaPods.
Денис Кутлубаев
7

Несмотря на то, что я использую Xcode5, и мне пришлось отредактировать схему сборки - попытка применить все вышеперечисленные предложения не помогла в моем случае.

У меня было две цели, скажем, «App» и «App FREE». Мои проблемы с общим архивом произошли, когда я пытался заархивировать бесплатную версию, которую я добавил после «нормальной» версии приложения. В моем случае, когда я выбрал схему на панели инструментов и выбрал «Редактировать схему» ... я увидел, что раздел «Сборка» имеет две цели, а именно: «Приложение» и «Бесплатное приложение».

Я снял все флажки для приложения, оставив только проверенные столбцы App FREE, и нажал кнопку ОК. В следующий раз, когда я выбрал «Продукт»> «Архив», я получил БЕСПЛАТНОЕ приложение вместо общего архива. :)

Стивен Уотсон
источник
7

Если у вас есть только один проект, возможно, это решение будет полезным. Эта проблема возникла, когда я дублировал цель. В результате у меня были две цели, построенные параллельно. Это было причиной проблемы. Общий архив IOS был построен.

Чтобы выключить параллель, перейдите к

  • Управлять схемами,
  • Редактировать схему,
  • Сложение,
  • Удалить другую цель.
Roman777
источник
5

У меня была эта проблема после обновления до iOS 9 и Xcode 7. Решение Джоша Х сработало для меня:

В каждом модуле в разделе Упаковка, Путь к папке с частными заголовками и Путь к папке с общими заголовками задано значение / 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

julianwyz
источник
5

У меня есть несколько проектов в моей рабочей области (GTL, Pods и мой основной проект), и это то, что сработало для меня:

Выберите проект, там будет 2 типа, есть проект и есть цели .

Для проектов, которые вам не нравятся 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 для каждого проекта и цели, чтобы убедиться, что они все одинаковы.

Брайан П
источник
Спасибо, что объяснили это шаг за шагом. это действительно помогло мне решить мою проблему.
Арслан
4

У меня была эта проблема. В моем случае это было вызвано сохранением цели приложения Mac как зависимости приложения iOS.

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

Мне пришлось удалить эту зависимость и собрать инструмент отдельно перед созданием самого приложения для iOS.

Томас Андрле
источник
Такие библиотеки, как lippd поставляются с целями ios и osx, я забыл удалить цель osx ...
doh
4

В моем сценарии я получил ошибочный «Общий архив» только после того, как начал включать код Swift в свой проект преимущественно Objective-C. После многих проблем и изучения архивного файла, который выплевывал Xcode, я заметил, чтоSwiftSupport долгих поисков папка (с необходимыми dylibs для среды выполнения Swift) находилась в моем архиве не так, как в новом ванильном архиве приложений проекта Swift. ,

Я нашел Installation Directoryнастройку сборки и заметил, что в моем проекте задан произвольный путь. Я просто удалил его (установив его на общее значение/Applications ), и следующий Build -> Archive, который я сделал, работал как ожидалось и дал мне надлежащий iOS App Archive.

TL; ДР: Убедитесь, что для вашей Installation Directoryнастройки сборки установлено значение по умолчанию, /Applicationsкогда вы включаете код Swift в свое приложение, особенно если вы начинаете с более старого файла проекта, который может иметь некоторые неожиданные устаревшие настройки сборки.

Райан Дорсхорст
источник
3

Оставив это здесь, чтобы спасти других от того же путешествия.

Я обнаружил, что мне нужно удалить ту же фазу сборки Copy Pod Resources из статической библиотеки в моей рабочей области.

Майкл
источник
после многих попыток, описанных выше, это сработало для меня (Xcode 7)
humphriesj
2

Дополнение к ответу Алекса Л.

Пункт 3. Измените «Build Settings» -> «Public Folder Folder Path» на «include / xxx», также работает.

CopperCash
источник
Это более правильно, чем № 3 выше. Ваши заголовки должны быть общедоступными, если вы создаете статическую библиотеку
bcattle
2

Если ничего из вышеперечисленного не помогло вам ... через много времени .......

Я удалил значение в Info.plist для Bundle Version, потому что был достаточно доволен только Bundle Version Short 1.0.Плохой. Не делай этого.

* Обратите внимание, что я на самом деле сделал это, отредактировав его в пользовательском интерфейсе справа, не осознавая, что он поместит пустой ключ в файл Info.plist. Я думаю, что это делает его недействительным. Мой пакет обнаружился как другие элементы во время архивации и не имел значка, и я не мог загрузить никуда.

Это сводится к недопустимым значениям в Info.plist. Если это недопустимый архив, попробуйте разархивировать старый архив и вставить / перезаписать текущий и посмотреть, исправит ли он это при перестройке архива.

ohc192
источник
1
  1. Зайдите в настройки сборки и добавьте

    yourAppName / Resources / dist.plist для Прав подписи кода

  2. Нажмите cmd + B с устройством iOS или реальным устройством, выбранным в качестве цели сборки

  3. Когда закончите -> перейдите в папку «Продукты» и щелкните правой кнопкой мыши на вашем AppName.app

  4. Выберите «Показать в Finder»

  5. Создайте папку с именем Payload ( заглавная "P" )

  6. Скопируйте yourAppName в свою папку Payload

  7. Создайте zip- файл из своей папки Payload

  8. Переименуйте zip в yourAppName.ipa

СДЕЛАНО

LoVo
источник
1

Попробовав практически все:

  • Чистый, Архив
  • удалить DerivedData, Архив
  • перезапустите Xcode (я использовал XCode7), архив
  • комбинации выше ...

Затем я заметил, что в моем загрузочном разделе «недостаточно свободного места»… около 1 ГБ или около того. Я перезагрузился, затем получил около 18 ГБ бесплатно.

Затем открыл Xcode и проект, выполнил Archive ... и неожиданно (после часа попыток построить архив) я наконец получил не общий архив.

Не знаю, была ли это проблема с свободным диском, которая исправила его, или перезагрузка macOS, которая это исправила, но у меня это сработало.

Питер Ли
источник
0

В моем случае мне пришлось переместить и FMDB, и BlocksKit в статические библиотеки. Ранее они были построены как подпроекты. Помните, что вы можете использовать липо для создания универсальных библиотек. При создании конечных продуктов код симулятора будет автоматически вырезан.

Maciej Swic
источник
0

Другой возможной причиной этого является наличие ссылок в «Целевых зависимостях» на проекты для другой платформы. В моем конкретном случае я работал над проектом, который разделяет код для OSX и iOS. В одной из целей iOS я случайно добавил цель OSX в качестве зависимости.

miguelSantirso
источник
0

Чтобы быть тщательным, я публикую свое решение.

Я столкнулся с той же самой проблемой, пытаясь создать Архив проекта iOS в Xcode 5.1.1 (5B1008). Ни одно из приведенных выше предложений не устранило проблему, и большинство из них не относились к делу (я не добавлял никаких фреймворков и не имел открытых записей в разделе «Копировать заголовки» моих этапов сборки).

В моем случае решение проблемы заключалось в простом закрытии моего проекта, удалении любых ранее созданных мной архивов, переходе в «Предпочтения»> «Учетные записи», удалении моей учетной записи разработчика, выходе из Xcode, повторном запуске, повторном добавлении моей учетной записи разработчика, запуске процесса архивирования. очередной раз. Это решило мою проблему немедленно.

Адэ Уорд
источник
0

Еще одно решение, так как все вышеперечисленное не работает для меня ...

Изменил User Header Search Paths(я полагаю, Header Search Pathsбудет работать так же элегантно), чтобы"$(BUILT_PRODUCTS_DIR)/BlocksKit" .

Задний план :

В BlockKit разработчики структурировали заголовки в основном проекте иначе, чем структура при развертывании. Таким образом, вы не можете ссылаться на заголовки в проекте и должны ссылаться на заголовки, скопированные в каталог сборки.

Mazyod
источник
0

То, как это работало для меня в (Xcode 5), у меня было 2 цели, и когда я редактировал схему, на левой панели редактора схемы вы увидите [BUILD, RUN, TEST, PROFILE XXX.APP, ANALYZE, ARCHIVE ] на панели BUILD вы увидите список целей вашего проекта в списке. В дальнем правом конце вы увидите выбор АРХИВ, убедитесь, что для архивирования выбрана только одна цель.

В моем проекте были выбраны 2 мои цели, я проверил только ту цель, которую хотел в продукте, и она сработала!

dexyjones
источник
0

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

Имея 2 отдельных проекта, фреймворк или разделяемую библиотеку и приложение для iOS, мне пришлось открывать 2 разных окна XCode, каждое из которых открывало файл .xcodeproj напрямую, а не общее .xcworkspace , чтобы предварительно собрать каждое из них.

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

Предыстория: я создаю SDK с открытым исходным кодом и демонстрационное приложение для iOS. Я открыл оба в одном рабочем пространстве. Установка Skip install to YES для целей SDK не позволит никому создать архив, так как он будет пустым, поэтому это не вариант. Использование Project вместо общедоступных заголовков приведет к тому, что в архиве будут отсутствовать файлы заголовков, которые должны быть распространены, так что это тоже не вариант.

ofavre
источник
0

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

Пьер-Ив Гийем
источник
0

В моем случае у меня был собственный скрипт, который копировал некоторые временные файлы в:

${TARGET_BUILD_DIR}/myTempDir

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

Eli
источник
0

Попробуйте установить $ (PROJECT_NAME) заголовки в пути к общедоступной папке заголовков projet. Вы должны перейти к настройке параметров библиотеки Target, а затем отредактировать путь к папке публичных заголовков как $ (PROJECT_NAME) заголовки.

Инко Моб
источник
0

При использовании Xcode 7 с cocoapods v.0.38.2 . Попробуйте удалить copy pod resourcesиз вашей сегодняшней цели расширения.

введите описание изображения здесь

CoderPug
источник
0

Я столкнулся с этой проблемой после добавления инструмента командной строки OS X в проект моего приложения для iOS, и для параметра «Пропустить установку» по умолчанию для цели инструмента командной строки было задано значение NO Поскольку вы, очевидно, не можете установить двоичный файл OS X на устройство iOS, архивация по умолчанию перешла на общий архив Xcode. Установка Skip Install на YES для этой цели устранила проблему.

Брайан Стюарт
источник