Не вдається створити архів додатків для iOS у xcode


175

У мене проблема з генерацією архіву додатків для iOS з програми. Додаток компілюється просто чудово і навіть працює в тренажері. Тепер я хотів зробити спеціальне тестування, і не можу створити Архів додатків для iOS. Коли я натискаю на Продукт -> Архів, він створює загальний архів xcode. Хтось може мені допомогти. Слід зазначити, що я вже створив архів додатків для iOS цього додатка. Він просто припинив генерувати iOS Archive чомусь. Дуже дякую.


7
Незважаючи на те, що питання про генерування архіву з xcode, я зіткнувся з цією проблемою, використовуючи xcodebuild. Рішення полягає в тому, щоб вказати місце призначення:xcodebuild -destination generic/platform=iOS
db42

Дякую @ db42, що це вдалося!
fabb

1
Ви можете детально розглянути резолюцію - де ви вносите зміни?
jlo-gmail

Якщо у вас є будь-які файли .xcodeproj в Project> Targets> Phases Build> target target, видаліть його звідти, а потім складіть ipa. Це працює для мене. Ура
Калпеш Панчасара

Відповіді:


316

Перевірте налаштування збірки:

  1. Пропустити встановлення НІ для основної цілі проекту
  2. Пропустити встановлення - ТАК для рамкових (підпроектів) цілей
  3. У фазах збірки для підпроектів заголовки копіювання повинні бути у проекті, а не у загальнодоступному (не застосовується, якщо будувати статичну бібліотеку)
  4. Каталог установок у розділі Розгортання дійсний (/ Наприклад, програми)

2
Це найповніша відповідь, в яку входять наведені вище часткові відповіді. Дякую Алекс Л! Я думаю, що це має бути обраною відповіддю на це питання.
Брендон

3
Як мета питання, як ви це зрозуміли? Здається, я покладаюся на Stackoverflow у всіх своїх питаннях, пов’язаних із побудовою.
philipkd

4
Гарний! Я думав, що це проблема з наданням профілів, але це спрацювало чудово. Підпроектом було відділення mapbox від route-me / MapView. Заголовки копіювання були ключовими, оскільки в публікації вказано нижче, її можна знайти у фазах збірки підпроекту.
rcarver

7
№3 виправлено мою проблему, але мені також потрібно було перемістити файли із приватного в проект до того, як мій архів був створений як архів додатків для iOS.
Томас Хайчак

4
Технічно проблема полягає не в тому, що заголовки є загальнодоступними під заголовками копіювання, це те, що для параметрів збірки> Путь папки загальнодоступних заголовків встановлено за замовчуванням /usr/local/include. Якщо ви створюєте статичну бібліотеку, заголовки повинні бути загальнодоступними, тому правильніше, якщо №3 має змінити шлях папки загальнодоступних заголовків на щось більш розумне, як-от include/$(TARGET_NAME). @CopperCash зазначає це у відповіді нижче.
bcattle

75

Це може статися, якщо ви додали рамку / бібліотеку ... вам потрібно відредагувати ціль-> Налаштування збірки цієї бібліотеки та встановити для параметра "Пропустити встановлення" значення "Так". При повторному архіві XCode слід знову почати випускати "Архів додатків для iOS", а не "загальний архів xcode".


але "Пропустити встановлення" недоступний у xcode 4.4.1, принаймні я не можу знайти пропустити все в своєму xcode
Mashhadi,

2
Те саме стосується доданих пакетів.
Марк Хорган

62

На додаток Пропустити встановити до Так, і якщо ви відкрили інший проект lib / framwork у рамках свого додатка, вам потрібно перемістити заголовки (якщо такі є) із загальнодоступних в проект у фазі збірки / заголовки копіювання .

фаза побудови вашої цілі ліб / кадр


3
Я ось-ось збирався втратити надію, оскільки Пропустити встановлення до Так не працювало для мене. Копіювання заголовків у Project зробило мені справу. Дякую!
ксм

10
Щоб допомогти вам локалізувати несправний підпроект Xcode, ви можете показати Загальний архів Xcode у Finder та дослідити пакет. Всередині .xcarchive ви побачите несправні заголовки в Продукція / usr / local / include.
MonsieurDart

1
Навіщо ставити кілька файлів для копіювання заголовків у загальнодоступні викрутки?
mskw

mskw, я думаю, якщо вбудований артефакт містить одне або більше загальнодоступних заголовків, він не може стати архівом "розгортання пристрою" (Архів додатків для iOS, звідки ви генеруєте IPA). Він залишається архівом проекту Xcode. Дякую
ebtokyo

1
чорт, спасибі, THS працював на мене .. Цікаво, як чорт вам вдасться знайти такі рішення :)
Fabio Napodano

45

Я зробив наступне, щоб змусити мене працювати:

  1. У мене була статична бібліотека тридцять , я використовував 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 .. і ви повинні отримати негайні результати для того, що ви хочете .. наприклад, це був вміст моєї папки (виконуючи кроки в підказці вище):

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

Тож я міг би сказати, що це має щось спільне з бібліотеками криптовалют та ssl .. пошук їх:

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

дав мені зрозуміти, що я забув встановити параметр пропуску на так.


Чудовий натяк! Я змінив деякі заголовки фреймів на "Приватні"; чомусь це змусило їх скопіювати ./usr/local/include.
Бен Мошер

1
завжди приємно допомогти @BenMosher :)
abbood

1
Найкраща відповідь, яку я отримав. Дякую за пораду, врятував мені день. !
neywen

Однозначно відповідь, яку я шукав - економія будівельних продуктів вказала на точну причину проблеми.
Dennis L

Ця обширна відповідь із "Зберегти вбудовані продукти" настільки корисна - @abbood, величезне спасибі вам. Сподіваюся, я можу повернути прихильність якогось дня.
Скотт Корскадден

21

Якщо ви експортуєте архів, відкрийте його та побачте /urs/local/includeв Продуктах спробуйте цю пропозицію :

У кожному з стручка, під Packaging, Private Headers Folder Pathі Public Headers Folder Pathвстановлюється в /usr/local/include. Якщо я їх очищую, тоді я отримую дійсний архів.

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

Працював для мене після оновлення моєї програми React Native до 0.11.0, Xcode 7та CocoaPods 0.39.0.beta.4.


1
Я можу підтвердити, що це працює! Поки ви пам'ятаєте, щоб очистити як приватні, так і загальнодоступні шляхи заголовка. Це також досить просто, якщо ви просто вибираєте всі стручки, шукайте шлях заголовка, а потім очищайте їх усі одночасно.
Діди

1
Я також можу підтвердити, що це працює, врятувало мені багато часу, це сталося, коли я модернізував свої стручки до версії 0.39.0.beta
Bryan P

Дивовижно. Працював для мене :) Я боровся з півтора дня. Дякую, Дякую, Дякую :) :) :)
Шрікант

Я думаю, що це той, хто працював для мене Xcode 7.0 iOS9. У мене немає ніяких какаодів, але це вирішило проблему. Людина подяки
Джефф H

На додаток до цього, мені довелося встановити SKIP_INSTALL на Так у своєму розширенні WatchKit і додатку, щоб це працювало.
Сніговик

12

Якщо ви використовуєте CocoaPods, а також WatchKit або розширення сьогодні, у репортажі CocoaPods є відкрите питання, в якому пояснюється, яка може бути ваша проблема.

Для мене рішенням було зняти Copy Pod Resourcesфазу із цілей WatchKit Extension та сьогоднішнього розширення під Build Phases. Проект складено та архівується, як очікувалося, колись я це зробив.

Сподіваюся, що це комусь допоможе, це мене натупило цілий день!


1
@ Lewis42 завжди міг додати щедрість;)
rebello95

Не бачите жодного варіанту, щоб голосувати за ваш коментар доведеться;)
lewis

@ Lewis42, вам доведеться додати щедрості до питання та присвоїти йому відповідь lol
rebello95

@ 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/isissue/3889
Porter Hoskins

3
Я перемістив усі заголовки стручків у «Фази збирання / заголовки» до розділу проекту від загальнодоступних, і це спрацювало. Тож справді проблема може бути в CocoaPods.
Денис Кутлубаєв

7

Хоча я використовую Xcode5 і те, що для мене було відсортовано, я редагував Схему збірки - спроби всіх перерахованих вище пропозицій, що застосовувалися, не допомогли в моєму випадку.

У мене були дві цілі, скажімо, "Додаток" та "БЕЗКОШТОВНО". Мої проблеми із загальним архівом виникли, коли я намагався архівувати БЕЗКОШТОВНУ версію, яку я додав після "звичайної" версії програми. У моєму випадку, коли я вибрав схему на панелі інструментів і вибрав «Редагувати схему», я побачив, що розділ «Збірка» має дві цілі, а саме: «Програма» та «БЕЗКОШТОВНО».

Я зняв галочку з усіх стовпців програми, залишивши лише стовпці додатка БЕЗКОШТОВНО, і натиснув ОК. Наступного разу, коли я вибрав продукт> Архів, я отримав БЕЗКОШТОВНУ програму замість загального архіву. :)


7

Якщо у вас є лише один проект, можливо, це рішення буде корисним. Ця проблема виникла, коли я дублював ціль. У результаті у мене було збудовано дві цілі паралельно. Це спричинило проблему. Був побудований загальний архів IOS.

Щоб повернути побудовану паралель, перейдіть до

  • Керуйте схемами,
  • Редагувати схему,
  • Побудувати,
  • Видаліть іншу ціль.

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


5

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

Виберіть проект, там буде два типи, є проект і є Цілі .

Для проектів, не є вашим основним , як 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
james_alvarez

4

У моєму сценарії я отримав помилковий "Загальний архів" лише після того, як почав включати код Swift у свій переважно проект Objective-C. Після безлічі усунення несправностей та вивчення архівного файлу, який виплюнув Xcode, я помітив, щоSwiftSupport папка (з необхідними дилібами для виконання програми Swift) знаходилась в іншому місці мого архіву, ніж у архіві додатків для ванільної фірми Swift Project app .

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

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


3

Залишаючи це тут, щоб врятувати інших від тієї самої подорожі.

Я виявив, що мені потрібно видалити ту саму фазу збірки ресурсів Copy Pod Resources з цілі статичної бібліотеки і в моєму робочому просторі.


після того, як спробував багато речей вище, це працювало для мене (Xcode 7)
humphriesj

2

Доповнення до відповіді Алекса Л.

Точка 3. Змініть "Налаштування збірки" -> "Шлях папки загальнодоступних заголовків" на "включити / ххх" також працює.


Це правильніше, ніж №3 вище. Якщо ви будуєте статичну бібліотеку, ваші заголовки повинні бути загальнодоступними
bcattle

2

Якщо ніщо з перерахованого вище не допомогло вам ... через багато часу .......

Я видалив значення в Info.plist для Bundle Version, тому що я був достатньо задоволений просто Bundle Version Short 1.0.Поганий. Не робіть цього.

* Примітка. Насправді я це зробив, відредагувавши його в інтерфейсі праворуч, не розуміючи, що він поставить порожній ключ у файлі Info.plist. Я думаю, що це робить його недійсним. Під час архівації мій пакет з’явився як інші елементи і не мав піктограми, і я не міг завантажувати його нікуди.

Це зводиться до недійсних значень в Info.plist. Якщо це не дійсний архів, спробуйте розпакувати старий архів і запустити / перезаписати поточний архів і побачити, чи він виправляє його під час відновлення архіву.


1
  1. Перейдіть до "Налаштування збірки" та додайте

    yourAppName / Resources / dist.plist до прав підписання коду

  2. Натисніть cmd + B за допомогою iOS Device або Real Device, вибраного як Build Target

  3. Закінчивши -> перейдіть до папки "Продукти" та клацніть правою кнопкою миші на вашомуAppName.app

  4. Виберіть "Показати у Finder"

  5. Створіть папку з іменем корисного навантаженнявеликої літери "P" )

  6. Скопіюйте свійAppName у свою папку корисного навантаження

  7. Створіть поштовий індекс зі своєї папки корисного навантаження

  8. Перейменуйте поштовий індекс у yourAppName.ipa

Зроблено


1

Спробувавши майже все:

  • Чисто, Архів
  • видалити DerivedData, Архів
  • перезапустити Xcode (я використовував XCode7), Archive
  • комбінації вище ...

Тоді я помітив, що мій завантажувальний розділ був "мало вільного місця на диску" ... близько 1 Гб або близько того. Я перезавантажився, після чого отримав близько 18 Гб безкоштовно.

Потім відкрив Xcode та проект, виконав Archive ... і на диво (після години спроб створити Архів) я нарешті дістав неардинарний архів.

Не маю уявлення, чи це вільний випуск диска, який його виправив, або перезавантаження макросу, який його виправив, але він працював на мене.



0

У моєму випадку мені довелося перемістити як FMDB, так і BlocksKit в статичні бібліотеки. Раніше вони будувалися як підпроекти. Пам'ятайте, що ви можете використовувати lipo для створення універсальних бібліотек. Під час складання кінцевих продуктів код тренажера буде позбавлений автоматично.


0

Інша можлива причина цього - посилання на "Цільові залежності" на проекти для іншої платформи. У моєму конкретному випадку я працював над проектом, який ділиться кодом для OSX та iOS. В одній із цілей iOS я випадково додав ціль OSX як залежність.


0

Щоб бути ретельним, я розміщую своє рішення.

Я зіткнувся з цією ж проблемою, намагаючись створити Архів проекту iOS в Xcode 5.1.1 (5B1008). Жодна з наведених вище пропозицій не вирішила цю проблему, і більшість з них не мали значення (я не додав жодних фреймворків і не мав публічних записів у розділі Копіювання заголовків моїх фаз збірки).

У моєму випадку виправлення проблеми полягало у тому, щоб просто закрити мій проект, видалити будь-який архів, який я раніше робив, перейти до Налаштування> Облікові записи, видалити обліковий запис розробника, закрити Xcode, перезапустити, повторно додати обліковий запис розробника, запустити процес архівування знову. Це негайно вирішило мою проблему.


0

Ще одне рішення, оскільки все вищезазначене не працювало для мене ...

Змінив User Header Search Paths(я думаю, він Header Search Pathsби працював так само елегантно) на "$(BUILT_PRODUCTS_DIR)/BlocksKit".

Фон :

У BlockKit розробники структурували заголовки в головному проекті інакше, ніж структуру при розгортанні. Таким чином, ви не можете посилатися на заголовки в проекті, і вони повинні посилатися на заголовки, скопійовані в каталог збірок.


0

Як це працювало для мене в (Xcode 5) У мене було 2 цілі, і коли я редагував схему, на лівій панелі редактора схем ви побачите [BUILD, RUN, TEST, PROFILE XXX.APP, ANALYZE, ARCHIVE ] з області BUILD ви побачите цілі проекту, вказані у списку. У крайньому правому кінці ви побачите виділення ARCHIVE, переконайтеся, що для архівування вибрано лише одну ціль.

У моєму проекті було вибрано 2 мої цілі, я перевірив лише потрібну ціль у продукті, і вона спрацювала!


0

Я вирішив цю помилку, відкривши виключно проект програми в XCode, тобто. не відкриваючи робочу область що включає додаток та інші проекти / бібліотеки / рамки.

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

Як хороший побічний ефект, XCode більше не відновлює кожну ціль кожного проекту після того, як я виконую чистку , в результаті чого скорочуються строки збирання.

Передумови: я створюю SDK з відкритим кодом та демонстраційний додаток для iOS. У мене обидва були відкриті в одній робочій області. Установка Пропуск установки в YES на цілі SDK буде перешкоджати будь-якому з створення архіву, як це було б порожнім, так що це не варіант. Використання Project замість загальнодоступних заголовків призведе до того, що в архіві відсутні файли заголовків, які слід розповсюдити, тому це також не було варіантом.


0

Бо це було тому, що я працював у робочій області. Проект зроблено в архіві, але не відображатиметься у вікні організатора. Я закрив робочу область і відкрив проект самостійно. Заархівовано відкрито в організаторі ... сподіваюся, що це допоможе.


0

У моєму випадку у мене був власний сценарій, який копіював деякі тимчасові файли у:

${TARGET_BUILD_DIR}/myTempDir

Це означало, що, дослідивши архів для перевірки його вмісту, я знайшов поруч із .app-файлом папку myTempDir. Одного разу я змінив сценарій для збереження в іншому місці.


0

Спробуйте встановити заголовки $ (PROJECT_NAME) в загальнодоступній папці "Загальні заголовки" проекту. Вам потрібно перейти до налаштування цілі бібліотеки, а потім відредагувати шлях папки загальних оголошень як заголовки $ (PROJECT_NAME).


0

Якщо використовується Xcode 7 з cocoapods v.0.38.2 . Спробуйте видалити copy pod resourcesзі своєї сьогоднішньої цілі розширення.

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


0

Я зіткнувся з цією проблемою, додавши інструмент командного рядка OS X до проекту мого додатка iOS, і для програми Skip Install було встановлено значення НІ для цілі інструменту командного рядка. Оскільки ви, очевидно, не можете встановити двійковий файл OS X на пристрій iOS, архівуючи за замовчуванням, в загальний архів Xcode. Налаштування Пропустити Встановити для ТА для цієї мети вирішено проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.