Codesign вернул 1 (неверный или неподходящий формат файла ifile) - PullRequest
40 голосов
/ 15 сентября 2011

Я работаю с Xcode 4.1 build 4B110f, пытаясь подготовить приложение для iOS к загрузке. Он проходит этап Product | Archive без ошибок, дважды запрашивая разрешение на подпись чего-либо. Но когда я пытаюсь проверить архив в Организаторе, происходит сбой:

### Codesigning '/Users/uqrchern/Library/MobileDevice/Provisioning Profiles/70D2381D-3733-4F5D-88B2-4729572C2864.mobileprovision' with 'iPhone Distribution: Ron Chernich'
+ /usr/bin/codesign --force --preserve-metadata --sign iPhone Distribution: Ron Chernich --resource-rules=/var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app/ResourceRules.plist --entitlements /var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/entitlements_plistrZ1Vwko6 /var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app
Program /usr/bin/codesign returned 1 : [/var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app: replacing existing signature
/var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app: object file format invalid or unsuitable
]
error: codesign failed with error 1

Я посмотрел на все подобные проблемы и решения (некоторые из которых не имеют никакого смысла или относятся к действительно старым версиям инструментов). Никто не имел малейшего значения.

Я также проверил 3 раза, что при проверке используется «производственный» сертификат, так же как и этап кодирования, который создает архив. Я даже превратил вышеприведенный вывод в скрипт-схему, чтобы я мог попробовать все сертификаты вручную: один и тот же результат каждый раз.

Может быть, подписанный файл .app действительно не подходит?

Кстати, у CodeSign нет флага версии, но справочная страница датирована 1 июня 2006 года. Двоичный файл имеет дату файла 20 ноября 2010 года.

ОБНОВЛЕНИЕ (на следующий день):

Дальнейшее изучение проблемы позволило найти неясную ссылку, в которой говорится, что для CodeSign требуется следующий набор переменных среды:

CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate

Используя вывод неудачного прогона Validate, я создал сценарий оболочки, который экспортировал эту переменную незадолго до неудачного шага codeign --force и альта! Кодовый знак работает.

Но это не очень помогает мне подготовить мой код для загрузки. Есть ли способ включить это в скрипт, запускаемый кнопкой «Подтвердить организатором» ??

НЕМНОГО ПОЗЖЕ, РЕШЕНИЕ! :

Согласно теории, где-то есть сценарий, который генерирует все команды, выполняемые во время проверки Organizer ... run, я немного покопался с помощью grep и find. Сценарий действительно существует, и его имя:

/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication

Это всего лишь Perl, и исправление заключается в добавлении требуемой переменной среды в ассоциативный массив% ENV в самом начале, скажем, в строке 72:

$ENV{CODESIGN_ALLOCATE} = '/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate';

Это полностью решает проблему. Я понятия не имею, где все другие постеры в Интернете, которые думают, что исправили это с помощью комбинаций удаления сертификатов, создания чистоты, закрытия и перезапуска Xcode и т. д., и т. д. Я просто спокойно утверждаю, что это исправление поддерживает науку над суевериями и работает для меня в Xcode 4.1 Build 4B110f и связанном с ним скрипте PackageApplication, работающем под Snow Leopard 10.6.8 с Perl 5.10.0

Ответы [ 3 ]

8 голосов
/ 04 декабря 2011

Только для того, чтобы это можно было удалить из списка без ответа. Как вы сказали, вам нужно добавить CODESIGN_ALLOCATE в массив $ENV:

$ENV{CODESIGN_ALLOCATE} = '/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate';

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

При использовании более новой версии Xcode, местоположение по умолчанию:

$ENV{CODESIGN_ALLOCATE} = '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate';
1 голос
/ 02 сентября 2013

Если вы получили это в последней версии XCode, то, что вы на самом деле хотите, в оболочке:

export CODESIGN_ALLOCATE=`xcode-select -print-path`/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate

, который будет использовать codesign_allocate из используемой вами версии Xcode.

Вы можете обновить версию Xcode, которую используют инструменты командной строки, запустив xcode-select -switch

0 голосов
/ 05 апреля 2012

У меня был этот обходной путь в течение длительного времени, но после обновления до Xcode 4.3 с iOS 5.1 SDK мой скрипт подписи (который вызывает codesign) перестал работать с ошибкой cannot find code object on disk:

output/Enterprise/Payload/MyProduct.app/MyProduct: replacing invalid existing signature    
output/Enterprise/Payload/MyProduct.app/MyProduct: cannot find code object on disk     
Code signing failed, not creating .ipa file    

Кажется, что этот обходной путь не нужен для двоичных файлов, созданных с помощью Xcode 4.3.Чтобы исправить это, я обновил свой bash-скрипт, чтобы проверить, существует ли местоположение перед экспортом:

  # Only export the environment variable if the location exists,
  # otherwise it breaks the signing process!
  if [ -f "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate" ]
  then
    echo Export environment variable for codesign_allocate location
    export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
  fi
...