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

В настоящее время я создаю все свои приложения с помощью 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), можно ли управлять этим с помощью инструмента Cossign, или можно переподписать с помощью 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" --включить "$mobileprovision"

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

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

13 ответов

Решение

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

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

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

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

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

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

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

Первым шагом является получение профиля обеспечения, который включает в себя все устройства, на которых вы хотите установить и запустить. Убедитесь, что в профиле есть сертификат, который вы установили в своей Связке ключей (например, 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

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

Я думаю, что проще всего использовать 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"

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

В 2020 году я сделал это с Fastlane -

Вот команда, которую я использовал

$ fastlane run resign ipa:"/Users/my_user/path/to/app.ipa" signing_identity:"iPhone Distribution: MY Company (XXXXXXXX)" provisioning_profile:"/Users/my_user/path/to/profile.mobileprovision" bundle_id:com.company.new.bundle.name

Полная документация здесь - https://docs.fastlane.tools/actions/resign/

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

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

Дайте путь 1).ipa

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

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

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

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

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

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

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

В моем случае у меня был 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 я открыл окно Organizer, выбрал этот новый архив и выполнил обычный (в данном случае Enterprise) экспорт.

Результатом стал хороший IPA, который работает.

Я пробовал все решения, но, наконец, я могу создать отставку ipa с этими командами

Свидетельства об отставке

  • * - это имя ipa, а также имя приложения. $PROVISION - это путь к профилю обеспечения. $CERTIFICATE - это имя сертификата в цепочке ключей, полное имя (обычное имя при двойном щелчке по сертификату)
  1. Перейдите в Каталог, в котором хотите создать новый ipa с сертификатами отставки. Поместите туда все файлы ipa, certificate и mobileprovision, а также установите сертификат

  2. security cms -D -i path / to / MyProfile.mobileprovision> provision.plist (Вызовите эту команду и замените мобильное обеспечение на путь к файлу)

  3. / usr / libexec / PlistBuddy -x -c 'Print:Entitlements' provision.plist> rights.plist (нажмите эту команду)

  4. распаковать -q *.ipa

  5. rm -rf Payload / *. приложение / _CodeSignature /

  6. / usr / libexec / PlistBuddy Payload / *. app / Info.plist (после этой команды мы должны добавить новый идентификатор пакета, если нам не нужно менять идентификатор пакета, тогда мы можем игнорировать эти 3 шага)

7.  Set :CFBundleIdentifier “com.mycompany.newbundleidentifier” (This should be new bundle ID)
8.  save
9.  quit
  1. cp $PROVISION Payload / *. app / embedded.mobileprovision

  2. codeign -d --entitlements: grantlements.plist Payload / *. app / (попробуйте проигнорировать эту команду, если приложение не работает, тогда используйте эту команду в следующий раз)

  3. codeign -f -s "$CERTIFICATE" --entitlements grantlements.plist Payload/.app / Frameworks/

  4. codeign -f -s "$CERTIFICATE" --entitlements grantlements.plist Payload / *. app /

  5. zip -qr resigned.ipa Полезная нагрузка

/questions/16598277/perepodpisat-ipa-iphone/16598295#16598295 /questions/18514464/kak-perepodpisat-fajl-ipa/18514486#18514486 https://coderwall.com/p/qwqpnw/resign-ipa-with-new-cfbundleidentifier-and-certificate

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

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

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

Если ваше приложение создано с использованием инструментов Flutter, изучите информацию обо всех расширениях модулей:

      codesign -d --verbose=4 Runner.app/Frameworks/xxx.framework |& grep 'Authority='

Результатом должно стать название вашей команды.

Запустите приведенный ниже сценарий оболочки для всех расширений:

      IDENTITY=<prefix of Team ID number>
ENTITLEMENTS=<entitlements.plist>
find Payload/Runner.app -type d -name '*framework' | xargs -I '{}' codesign -s $IDENTITY -f --entitlements $ENTITLEMENTS {} 

И, наконец, не забудьте codesign то Runner.app сам

Вы можете использовать приложение XReSign (простой инструмент с графическим интерфейсом) для повторной подписи вашего ipa, я использовал его для повторной подписи моего корпоративного приложения для распространения, и он работал нормально

https://github.com/xndrs/XReSign

Все, что тебе нужно

  1. ипа в отставку
  2. Mobileprovision
  3. права (для создания прав, пожалуйста, проверьте следующие шаги)
  4. сертификат распространения предприятия

Для создания прав:

Откройте терминал

      $ security cms -D -i "your_path/Enterprise_Distribution.mobileprovision" > provision.plist

тогда

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

Спасибо

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

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

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

Другие вопросы по тегам