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

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

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

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

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

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

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

  • unzip app.ipa
  • appname = $(ls Полезная нагрузка)
  • 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 будут меняться, но контент выглядит примерно так же.

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

Ответ 1

Наконец-то это получилось!

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

Re-знак

/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

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

Ответ 2

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

----- Как отказаться от приложения для 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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

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

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

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

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

Ответ 5

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

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

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

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

  • Я извлек старое приложение из старого файла IPA (через unzipping, приложение - единственное, что находится в папке Payload)

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

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

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

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

В результате появился хороший IPA.

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Повторное подписание script в Github

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

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

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