Переподписать 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 из сборки.
Я продублировал существующий.xcarchive и начал заменять содержимое. (Я проигнорировал файл.dSYM.)
Я извлек старое приложение из старого файла IPA (через разархивирование; приложение - единственная вещь в папке Payload)
Я переместил это приложение в новый.xcarchive, под
Products/Applications
заменить приложение, которое было там.Я редактировал
Info.plist
редактированиеApplicationProperties/ApplicationPath
ApplicationProperties/CFBundleIdentifier
ApplicationProperties/CFBundleShortVersionString
ApplicationProperties/CFBundleVersion
Name
Я переместил.xcarchive в папку архива Xcode, обычно
/Users/xxxx/Library/Developer/Xcode/Archives
,В Xcode я открыл окно Organizer, выбрал этот новый архив и выполнил обычный (в данном случае Enterprise) экспорт.
Результатом стал хороший IPA, который работает.
Я пробовал все решения, но, наконец, я могу создать отставку ipa с этими командами
Свидетельства об отставке
- * - это имя ipa, а также имя приложения. $PROVISION - это путь к профилю обеспечения. $CERTIFICATE - это имя сертификата в цепочке ключей, полное имя (обычное имя при двойном щелчке по сертификату)
Перейдите в Каталог, в котором хотите создать новый ipa с сертификатами отставки. Поместите туда все файлы ipa, certificate и mobileprovision, а также установите сертификат
security cms -D -i path / to / MyProfile.mobileprovision> provision.plist (Вызовите эту команду и замените мобильное обеспечение на путь к файлу)
/ usr / libexec / PlistBuddy -x -c 'Print:Entitlements' provision.plist> rights.plist (нажмите эту команду)
распаковать -q *.ipa
rm -rf Payload / *. приложение / _CodeSignature /
/ usr / libexec / PlistBuddy Payload / *. app / Info.plist (после этой команды мы должны добавить новый идентификатор пакета, если нам не нужно менять идентификатор пакета, тогда мы можем игнорировать эти 3 шага)
7. Set :CFBundleIdentifier “com.mycompany.newbundleidentifier” (This should be new bundle ID)
8. save
9. quit
cp $PROVISION Payload / *. app / embedded.mobileprovision
codeign -d --entitlements: grantlements.plist Payload / *. app / (попробуйте проигнорировать эту команду, если приложение не работает, тогда используйте эту команду в следующий раз)
codeign -f -s "$CERTIFICATE" --entitlements grantlements.plist Payload/.app / Frameworks/
codeign -f -s "$CERTIFICATE" --entitlements grantlements.plist Payload / *. app /
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
Все, что тебе нужно
- ипа в отставку
- Mobileprovision
- права (для создания прав, пожалуйста, проверьте следующие шаги)
- сертификат распространения предприятия
Для создания прав:
Откройте терминал
$ 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.
Для меня - все профили обеспечения были подписаны одним и тем же сертификатом / подписью.