Переподписать IPA (iPhone) - PullRequest
       40

Переподписать IPA (iPhone)

126 голосов
/ 01 августа 2011

В настоящее время я создаю все свои приложения с помощью hudson, используя xcodebuild, за которым следует xcrun без каких-либо проблем.

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

Моя проблема заключается в том, что когда я пытаюсь закрыть приложение, оно не устанавливается на моем устройстве (и должноэто сборка Enterprise).Сообщение об ошибке на устройстве (не в iTunes), и оно просто говорит мне, что не может установить приложение.Больше информации не дается.

Я нашел некоторую информацию, (http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for-upload/)

И это может быть возможно.Проблема, с которой я сталкиваюсь, заключается в том, что, похоже, он не внедряет профиль обеспечения мобильной связи, как я это делаю с моими обычными сборками (с использованием xcrun), это можно контролировать с помощью инструмента CoSignSign или можно переподписать с помощью xcrun?

С моим сценарием отставки я сейчас выполняю

  • распаковать app.ipa
  • appname = $ (ls Payload)
  • xcrun -sdk iphoneosPackageApplication -s "$ provisioning_profile" "$ project_dir / Payload / $ appname" -o "$ project_dir / app-resigned.ipa" --sign "$ provisioning_profile" --embed "$ mobileprovision"

Я посмотрел в итоговом файле ipa, и он, похоже, очень похож на оригинальное приложение.Какие файлы должны действительно изменить здесь?Сначала я думал, что _CodeSignature / CodeResources изменится, но содержимое выглядит примерно так же.

Указатели очень ценятся.

Ответы [ 9 ]

210 голосов
/ 03 августа 2011

Наконец-то все заработало!

Протестировано с IPA, подписанным с помощью cert1, для отправки в магазин приложений без добавления устройств в профиле обеспечения.Результатом является новый IPA, подписанный с использованием учетной записи предприятия и профиля мобильного обеспечения для внутреннего развертывания (профиль мобильного обеспечения внедряется в IPA).

Решение:

Распакуйте IPA

unzip Application.ipa

Удалить старую сигнатуру CodeSignature

rm -r "Payload/Application.app/_CodeSignature" "Payload/Application.app/CodeResources" 2> /dev/null | true

Заменить встроенный мобильный профиль обеспечения

cp "MyEnterprise.mobileprovision" "Payload/Application.app/embedded.mobileprovision"

Повторная подпись

/usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

Повторная упаковка

zip -qr "Application.resigned.ipa" Payload

Редактировать: Удалена часть прав (см. Комментарий к переулкам, спасибо)

36 голосов
/ 11 мая 2016

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

----- Как отказаться от приложения для iOS -----

Допустим, вы получили приложение (например, MyApp.ipa) от другого разработчика и хотите иметь возможность установить и запустить его на своих устройствах (например, с помощью ideviceinstaller ).

Подготовка новых подписывающих активов

Первый шаг - получить Профиль обеспечения , который включает в себя все устройства, на которые вы хотите установить и запустить. Убедитесь, что профиль содержит сертификат, который вы установили в Keychain Access (например, iPhone Developer: Some Body (XXXXXXXXXX)). Загрузите профиль (MyProfile.mobileprovision), чтобы заменить профиль, встроенный в приложение.

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

$ security cms -D -i path/to/MyProfile.mobileprovision > provision.plist

Это создаст XML-файл, описывающий ваш Provisioning Profile . Далее мы хотим извлечь права в файл.

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist

Заменить профиль обеспечения и уйти в отставку

Если вы работаете с файлом .ipa , сначала разархивируйте приложение (если у вас есть .app , вы можете пропустить этот шаг).

$ unzip MyApp.ipa

Ваш рабочий каталог теперь будет содержать Payload/ и Payload/MyApp.app/. Затем удалите старые файлы подписи кода.

$ rm -rf Payload/MyApp.app/_CodeSignature

Замените существующий профиль обеспечения (т. Е. Embedded.mobileprovision) своим собственным.

$ cp path/to/MyProfile.mobileprovision Payload/MyApp.app/embedded.mobileprovision

Теперь подпишите приложение с помощью сертификата, включенного в ваш профиль обеспечения, и созданного вами ранее файла authorlements.plist.

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app

ВАЖНО: Вы также должны отказаться от всех платформ, включенных в приложение . Вы найдете их в Payload/MyApp.app/Frameworks. Если приложение написано на Swift или если оно включает какие-либо дополнительные фреймворки, они должны быть отклонены, иначе приложение будет установлено, но не запущено.

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app/Frameworks/*

Теперь вы можете разархивировать приложение.

$ zip -qr MyApp-resigned.ipa Payload

Выполнено

Теперь вы можете удалить каталог Payload, поскольку у вас есть исходное приложение (MyApp.ipa) и ваша отказавшаяся версия (MyApp-resigned.ipa). Теперь вы можете установить MyApp-resigned.ipa на любое устройство, включенное в ваш профиль обеспечения.

11 голосов
/ 02 апреля 2012

Я успешно последовал этому ответу, но, так как права изменились, я просто удалил часть --entitlements "Payload/Application.app/Entitlements.plist" от второго до последнего оператора, и это сработало как талисман.

4 голосов
/ 17 июля 2018

Проверено с Mac OS High Sierra и Xcode 10

Вы можете просто реализовать то же самое с помощью приложения iResign .

Укажите путь 1) .ipa

2) Новый профиль обеспечения

3) Файл прав (необязательно, добавляйте только при наличии прав)

4) Идентификатор пакета

5) Сертификат распространения

Вы можете увидеть выходной файл .ipa, сохраненный после повторной подписи

Простой и мощный инструмент

3 голосов
/ 05 октября 2017

Ни один из этих уходящих в отставку подходов не работал для меня, поэтому мне пришлось придумать что-то еще.

В моем случае у меня был IPA с просроченным сертификатом.Я мог бы перестроить приложение, но, поскольку мы хотели убедиться, что мы распространяем точно такую ​​же версию (только с новым сертификатом), мы не хотели перестраивать его.

Вместо способов отказа, упомянутых вдругие ответы, я обратился к методу Xcode по созданию IPA, который начинается с .xcarchive из сборки.

  1. Я продублировал существующий .xcarchive и начал заменять его содержимое.(Я проигнорировал файл .dSYM.)

  2. Я извлек старое приложение из старого файла IPA (через разархивирование; приложение - единственная вещь в папке Payload)

  3. Я переместил это приложение в новый .xcarchive, под Products/Applications заменив приложение, которое было там.

  4. Я отредактировал Info.plist, редактирование

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. Я переместил .xcarchive в папку архива Xcode, обычно /Users/xxxx/Library/Developer/Xcode/Archives.

  6. В Xcode я открыл окно Организатор, выбрал этот новыйархивировать и делать регулярный (в данном случае Enterprise) экспорт.

В результате получился хороший IPA, который работает.

1 голос
/ 14 сентября 2017

С опцией отставки Fastlane sigh вы можете сделать это очень легко.

sigh resign -p <path-to-profile-with-mobileprovision-ext> -i <code-sighning-identity-of-your-app>

Вы также можете загрузить профиль, используя sigh, непосредственно перед командой.

0 голосов
/ 03 июня 2019

Я думаю, что проще всего использовать Fastlane:

sudo gem install fastlane -NV
hash -r # for bash
rehash # for zsh
fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"
0 голосов
/ 17 февраля 2016

Если у вас есть приложение с расширениями и / или приложение наблюдения, и у вас есть несколько профилей инициализации для каждого приложения расширения / наблюдения, то вам следует использовать этот сценарий для повторной подписи файла ipa.

Повторная подпись скрипта на Github

Вот пример использования этого скрипта:

./resign.sh YourApp.ipa "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovision -p <path_to_provisioning_profile_for_watchkitapp>.mobileprovision -p <path_to_provisioning_profile_for_todayextension>.mobileprovision  resignedYourApp.ipa

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

Для меня - все профили обеспечения были подписаны одним и тем же сертификатом / подписью.

0 голосов
/ 26 ноября 2014

Спасибо, Эрик, за публикацию этого. Это сработало для меня. Я хотел бы добавить примечание о дополнительном шаге, в котором я нуждался. В «Payload / Application.app /» находился каталог с именем « CACertChains », в котором содержался файл с именем « cacert.pem ». Мне пришлось удалить каталог и .pem, чтобы выполнить эти шаги. Еще раз спасибо! -

...