Переписать 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.
Для меня все профили обеспечения были подписаны с тем же сертификатом/подписью.