Подтвердить что ты не робот

Codesign возвратил 1 (недопустимый или неподходящий формат объекта ifile)

Я работаю с 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 раза, что проверка использует "производственный" сертификат, также как и код, который создает архив. Я даже включил вышеприведенный вывод в schell script, чтобы я мог попробовать все сертификаты вручную: каждый раз каждый раз.

Возможно, подписанный файл .app не подходит?

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

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

Исследование проблемы далее обнаружило неясную ссылку, в которой говорилось, что для кодирования требуется следующее окружение var:

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

Используя вывод из неудачного прогона проверки, я создал оболочку script, которая экспортировала этот var непосредственно перед ошибкой кодового кода --force step и viola! Работает код.

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

МАЛЕНЬКАЯ ПОЗЖЕ ЕЩЕ, РЕШЕНИЕ!:

В соответствии с теорией существует script someplace, которая генерирует все команды, запускаемые во время проверки Organizer... запускать, я делал некоторые копания с grep и find. script действительно существует и его имя:

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

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

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

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

4b9b3361

Ответ 1

Просто чтобы это можно было снять с оставшегося без ответа списка. Как вы сказали, вам нужно добавить 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';

Ответ 2

В случае, если вы получите это в последней версии Xcode, то, что вы действительно хотите, есть в оболочке:

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

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

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

Ответ 3

У меня было это решение долгое время, но после обновления до Xcode 4.3 с помощью iOS 5.1 SDK мое подписывание script (которое вызывает 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 script, чтобы проверить, существует ли это местоположение перед его экспортом:

  # 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