Как переподписать ipa файл?

107

Как подписать файл .ipa с профилем обеспечения после того, как я сгенерирую IPA, как показано ниже, с другим профилем обеспечения? Я хотел бы подписать IPA со специальным профилем подготовки для бета-тестирования, а затем повторно подписать точный IPA с профилем предоставления приложения для магазина приложений.

/usr/bin/xcrun -sdk iphoneos PackageApplication -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" --sign "${DEVELOPER_NAME}" --embed "${PROVISONING_PROFILE}"
Джонни
источник
1
Возможный дубликат Re-
Sign

Ответы:

207

Это действительно легко сделать из командной строки. У меня был сценарий для этого. Теперь он включен в скрипт ipa_sign в https://github.com/RichardBronosky/ota-tools, который я использую ежедневно. Если у вас есть какие-либо вопросы об использовании этих инструментов, не стесняйтесь спрашивать.

Суть его в следующем:

CODESIGN_ALLOCATE=`xcrun --find codesign_allocate`; export CODESIGN_ALLOCATE
IPA="/path/to/file.ipa"
PROVISION="/path/to/file.mobileprovision"
CERTIFICATE="Name of certificate: To sign with" # must be in keychain
# unzip the ipa
unzip -q "$IPA"
# remove the signature
rm -rf Payload/*.app/_CodeSignature
# replace the provision
cp "$PROVISION" Payload/*.app/embedded.mobileprovision
# sign with the new certificate (--resource-rules has been deprecated OS X Yosemite (10.10), it can safely be removed)
/usr/bin/codesign -f -s "$CERTIFICATE" Payload/*.app
# zip it back up
zip -qr resigned.ipa Payload

Ваше новое подписанное приложение называется resigned.ipa.

Бруно Броноски
источник
31
7 голосов за и ни одного вопроса. Думаю, мой bash настолько ясен.
Бруно Броноски
4
В самом деле, это добрый сэр.
Руи Перес
3
@RahmathullahMPulikkal Я вижу, что я ошибочно жестко запрограммировал путь в сути. Вам действительно стоит использовать github.com/RichardBronosky/ota-tools/blob/master/ipa_sign вместо сути. Это поддерживаемый код.
Бруно Броноски
5
Вы можете получить предупреждение / ошибку в параметрах --resource-rules, которые устарели в OS X Yosemite (10.10), просто удалите этот параметр, чтобы решить эту проблему.
ıɾuǝʞ
4
Одна маленькая заметка: это выглядит CodeResourcesв настоящее время находится внутри в _CodeSignatureпапке, так что вам просто нужно удалить эту папку.
dadude999 07
36

Проверьте iResign, чтобы узнать, как это сделать!

[править] после некоторой возни я нашел решение увольнения с учетом связки ключей. Вы можете проверить это на https://gist.github.com/Weptun/5406993.

Блиц
источник
есть ли какой-либо инструмент, который может изменить отображаемое имя вместе с идентификатором пакета при увольнении? Это поможет использовать разные отображаемые имена для разных сред. например, App-Dev, App-QA, App-Stage и т. д.
Nishanth Nair
1
Да, floatsign.sh делает именно это.
Blitz
Работает. Просто и красиво.
Арджун Калидас
13

Вид старого вопроса, но с последним XCode codesignлегко:

$ codesign -s my_certificate example.ipa 

$ codesign -vv example.ipa
example.ipa: valid on disk
example.ipa: satisfies its Designated Requirement
BryanH
источник
2
@Pavel На этот вопрос был дан ответ, когда последней версией была iOS 6.x. С тех пор у нас было два основных релиза, которые, очевидно, многое изменили. Возможно, вы захотите ограничить свой поиск ответами, ориентированными на современные технологии.
BryanH 01
У меня это сработало. вам нужно заменить my_certificate именем ключа в вашей цепочке для ключей.
Franziskus Karsunke
2
codesignкоманда также используется в ответе @BrunoBronosky. Я не могу использовать его непосредственно в файле "* .ipa", а параметры "-vv" всегда возвращаются code object is not signed at allдля файлов, которые, как я знаю, подписаны ...
Мариано Панига
12

Все ответы, размещенные здесь, не совсем сработали для меня. Они в основном пропускали подписание встроенных фреймворков (или включение прав).

Вот что у меня сработало (предполагается, что в текущем каталоге существует один файл ipa):

PROVISION="/path/to/file.mobileprovision"
CERTIFICATE="Name of certificate: To sign with" # must be in the keychain

unzip -q *.ipa
rm -rf Payload/*.app/_CodeSignature/

# Replace embedded provisioning profile
cp "$PROVISION" Payload/*.app/embedded.mobileprovision

# Extract entitlements from app
codesign -d --entitlements :entitlements.plist Payload/*.app/

# Re-sign embedded frameworks
codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/Frameworks/*

# Re-sign the app (with entitlements)
codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/

zip -qr resigned.ipa Payload

# Cleanup
rm entitlements.plist
rm -r Payload/
Simonseyer
источник
Полезный комментарий из сообщения выше (Rich): stackoverflow.com/questions/5160863/…
Serzas
9

Вздох Fastlane представляет собой довольно надежное решение для отказа от IPA.

Из их README:

Уходить в отставку

Если вы сгенерировали свой ipaфайл, но хотите применить к файлу ipa другую подпись кода, вы можете использовать sigh resign:

fastlane sigh resign

sigh найдет для вас файл ipa и профиль обеспечения, если они находятся в текущей папке.

Вы можете передать дополнительную информацию с помощью командной строки:

fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"

Он даже будет обрабатывать профили подготовки для вложенных приложений (например, если у вас есть приложения watchkit)

Матлиу
источник
8

Я обновил код Брайана для своего iMac Sierra:

# this version was tested OK vith macOs Sierra 10.12.5 (16F73) on oct 0th, 2017
# original ipa file must be store in current working directory 

IPA="ipa-filename.ipa"
PROVISION="path-to.mobileprovision"
CERTIFICATE="hexadecimal-certificate-identifier" # must be in keychain
# identifier maybe retrieved by running: security find-identity -v -p codesigning

# unzip the ipa
unzip -q "$IPA"

# remove the signature
rm -rf Payload/*.app/_CodeSignature

# replace the provision
cp "$PROVISION" Payload/*.app/embedded.mobileprovision

# generate entitlements for current app
cd Payload/
codesign -d --entitlements - *.app > entitlements.plist
cd ..
mv Payload/entitlements.plist entitlements.plist

# sign with the new certificate and entitlements
/usr/bin/codesign -f -s "$CERTIFICATE" '--entitlements' 'entitlements.plist'  Payload/*.app

# zip it back up
zip -qr resigned.ipa Payload
Пьер Прио
источник
Я делаю следующую ошибку: rightlements.plist: нераспознанный тип
Amr Angry
Вы можете поделиться содержимым файла с правами?
Пьер Прио
Работал как шарм!
Луис Э. Прадо
5
  1. Разархивируйте файл .ipa, изменив его расширение на .zip
  2. Перейти к полезной нагрузке. Вы найдете файл .app
  3. Щелкните правой кнопкой мыши файл .app и выберите Показать содержимое пакета.
  4. Удалить _CodeSignedпапку
  5. Замените embedded.mobileprovisionфайл новым профилем обеспечения
  6. Перейдите в KeyChain Access и убедитесь, что сертификат, связанный с предварительным профилем, присутствует.
  7. Выполните указанную ниже команду: /usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

  8. Теперь снова заархивируйте папку Payload и измените расширение .zip на .ipa.

Надеюсь, это поможет.

Для справки перейдите по указанной ниже ссылке: http://www.modelmetrics.com/tomgersic/codesign-re-signing-an-ipa-between-apple-accounts/

Дхармеш Сиддхпура
источник