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

129

В настоящее время я без проблем создаю все свои приложения с помощью 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- загрузить / )

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

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

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

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

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

Erik
источник

Ответы:

212

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

Протестировано с 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"

Re-пакет

zip -qr "Application.resigned.ipa" Payload

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

Erik
источник
6
Одна вещь, которая вызвала у нас проблемы, заключалась в том, что файл Entitlements, если он у вас есть, должен соответствовать идентификатору приложения, предоставленному Apple. Поскольку мы меняли идентификатор пакета, права не совпадали. Приложение будет работать, но связка ключей очищается после каждого запуска.
tjg184
5
Согласно oleb.net/blog/2011/06/code-signing-changes-in-xcode-4 , идентификатор приложения встроен в двоичный файл, поэтому вы можете уйти в отставку только с тем же идентификатором приложения. Я знаю, что не смог уволиться с другим идентификатором приложения.
Майкл Балтакс 05
7
@ValerioSantinelli Вам нужно будет перенести права из предыдущего подписания кода. Push-уведомления FWIW не будут работать без прав. После распаковки: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.appЗатем во время отставки добавить--entitlements entitlements.plist
Питер
11
codeign не работает в Yosemite - Предупреждение: --resource-rules устарело в Mac OS X> = 10.10! Payload / Aaa.app / ResourceRules.plist: не удается прочитать ресурсы
Jibeex
4
Предупреждение: --resource-rules устарело в Mac OS X> = 10.10! Payload / Application.app / ResourceRules.plist: не может читать ресурсы. Получили эту ошибку?
мегха
44

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

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

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

Подготовьте новые активы для подписи

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

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

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

Это создаст XML-файл, описывающий ваш профиль обеспечения . Затем мы хотим извлечь права в файл.

$ /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

Теперь подпишите приложение с помощью сертификата, включенного в ваш профиль обеспечения, и файла grantlements.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 на любое устройство, включенное в ваш профиль подготовки.

InnisBrendan
источник
Будет ли этот же подход применяться к профилям распределения? IE: могу ли я извлечь права и повторно подписать их из своего distro.mobileprovision?
Chase Florell
@grez Будет ли это работать и для раздачи IPA?
LearneriOS
Я имею в виду также распространение IPA корпоративных приложений @grez
LearneriOS
@LearneriOS У меня это не сработало для Enterprise IPA Distribution. Я использую Sierra, Xcode 8, iOS 10. Приложение устанавливается через iTunes, но сразу после установки удаляется.
Брайан Брайс,
@PhoenixFF Я не уверен в установке с помощью iTunes, но можете ли вы попробовать установить из командной строки следующим образом: $ ideviceinstaller -i myapp.ipa
InnisBrendan
11

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

alleus
источник
Я второй предыдущий комментарий. Удалите права доступа, чтобы эта работа работала с помощью современного набора инструментов.
Bruno Bronosky 05
2
Без прав мое приложение на самом деле начал работать странно, давая это в журнале: SecItemCopyMatching: missing entitlement. Я не отдельный Entitlements.plist файл, поэтому для сохранения пособий , которые я использовал @ комментарий LordT в : сначала создать файл причитающихся сумм: echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlements, а затем использовать его при подписании: --entitlements temp/newEntitlements.
Булат
5

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

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

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

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

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

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

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

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

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

Saranjith
источник
4

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

В моем случае у меня был 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
Это гениальное решение, которое до сих пор работает с Xcode 9.2. В моем случае я просто скопировал старый файл .app под существующий .xcarchive. Я не менял Info.plist, поэтому версия приложения осталась прежней, но была подписана новым корпоративным сертификатом.
dodgy_coder
3

Думаю, проще всего использовать 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"
Мариан Черный
источник
Я пробовал много способов, но безуспешно. Это решение сработало для меня, спасибо.
Омид Киа
1

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

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

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

Вайнит
источник
0

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

Уильям Пауэр
источник
-1

Если у вас есть приложение с расширениями и / или приложение для часов и у вас есть несколько профилей подготовки для каждого приложения расширения / просмотра, вам следует использовать этот скрипт для повторной подписи файла 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.

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

RPM
источник
Ваша ссылка не работает ... нашел эту альтернативу, посмотрев на github автора. github.com/fastlane/fastlane/blob/…
jugutier
это старый ответ, и, вероятно, его следует удалить, поскольку он больше не работает, но его нельзя удалить в StackOverflow
RPM
1
Это сработало для нас, просто нужно обновить ссылку на это: github.com/fastlane/fastlane/blob/…
jugutier
хорошо знать, что он все еще работает.
RPM
fastlane sigh resign YourApp.ipa --signing_identity "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovisionВместо этого используйте .
green0range 03