Повторне підписання IPA (iPhone)


129

В даний час я будую всі свої програми з Хадсоном за допомогою xcodebuild з подальшим xcrun без проблем

Мені надійшло кілька файлів IPA від різних людей, які я хотів би повторно підписати з обліковим записом підприємства, а не корпоративним обліковим записом (для магазину додатків або іноді спеціально поширюється).

Моя проблема полягає в тому, що коли я намагаюся подати у відставку додаток, він не встановиться на моєму пристрої (і це повинно, оскільки це збірка підприємства). Повідомлення про помилку є на пристрої (не в iTunes), і воно просто повідомляє, що не вдалося встановити додаток. Більше інформації не надається.

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

І це може бути можливим. Проблема, з якою я стикаюся, полягає в тому, що, здається, не вбудовується профіль забезпечення мобільних пристроїв, як це роблять у моїй звичайній збірці (використовуючи xcrun), чи це можливо керувати інструментом кодування, або чи можна повторно підписувати за допомогою xcrun ?

Зі своїм скриптом відставки я зараз

  • розпакуйте app.ipa
  • appname = $ (ls корисна навантаження)
  • xcrun -sdk iphoneos PackageApplication -s "$ tasking_profile" "$ project_dir / Payload / $ name"

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

Покажчики дуже цінуються.

Відповіді:


211

Нарешті це почало працювати!

Тестовано за допомогою 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

Редагувати: Видалено частину права (див. Коментар із алеїв, дякую)


6
Одне, що викликало у нас проблеми, - це файл Entitlements, якщо він у вас є, повинен відповідати ідентифікатору програми, наданому Apple. Оскільки ми змінювали ідентифікатор пакету, права не збігалися. Додаток запуститься, але брелок очиститься після кожного запуску.
tjg184

5
Згідно з oleb.net/blog/2011/06/code-signing-changes-in-xcode-4 , ідентифікатор програми вбудований у двійковий код, тому ви можете подати у відставку лише за допомогою того ж ідентифікатора програми. Я знаю, що не зміг подати у відставку з іншим ідентифікатором додатка.
Майкл Балтакс

7
@ValerioSantinelli Вам потрібно буде перенести права з попереднього підписання коду. Поштові сповіщення FWIW не будуть працювати без прав. Після розпакування: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.appПотім під час відставки додайте--entitlements entitlements.plist
Петро,

11
невдало кодове оформлення на Yosemite - Увага: --resres-правила в Mac OS X застаріли> 10,10! Корисне навантаження / Aaa.app / ResourceRules.plist: не вдається прочитати ресурси
Jibeex

4
Попередження: --ресурси-правила застаріли в Mac OS X> = 10.10! Payload / Application.app / ResourceRules.plist: не вдається прочитати ресурси. Отримати цю помилку?
megha

44

Відповіді на це запитання трохи застаріли і відсутні потенційно ключові кроки, тому це оновлене керівництво по встановленню програми від зовнішнього розробника.

----- Як подати у відставку додаток для iOS -----

Скажімо, ви отримуєте додаток (наприклад, MyApp.ipa) від іншого розробника, і ви хочете мати можливість встановити та запустити його на своїх пристроях (наприклад, використовуючи ideviceinstaller ).

Підготуйте нові активи для підписання

Першим кроком є ​​створення профілю забезпечення, який включає всі пристрої, які ви хочете встановити та запустити. Переконайтеся, що профіль містить сертифікат, встановлений у вашому доступі до брелоків (наприклад, розробник iPhone: деякий корпус (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

Замініть наявний профіль резервування (тобто вбудований.мобільний захист) на власний.

$ cp path/to/MyProfile.mobileprovision Payload/MyApp.app/embedded.mobileprovision

Тепер підпишіть програму разом із сертифікатом, який міститься у вашому профілі резервування, та у списку прав.

$ /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 на будь-який пристрій, включений у ваш профіль надання.


Чи застосовуватиметься такий самий підхід до профілів розподілу? IE: чи можу я отримати права та повторно підписатись із свого distro.mobileprovision?
Чейз Флорелл

@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"частину другого до останнього твердження, і це спрацювало як шарм.


Я 2-й попередній коментар. Видаліть права, щоб зробити цю роботу сучасним інструментарієм.
Бруно Броноський

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, збережений після повторного підписання

Простий і потужний інструмент


4

Жоден із цих відставних підходів не працював для мене, тому мені довелося розробити щось інше.

У моєму випадку у мене був IPA із сертифікатом минулого терміну дії. Я міг би відновити додаток, але, оскільки ми хотіли переконатися, що ми поширюємо абсолютно таку ж версію (просто з новим сертифікатом), ми не хотіли її відновлювати.

Замість способів відставки, згаданих в інших відповідях, я звернувся до методу створення коду IPA Xcode, який починається з .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 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.

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


Ваше посилання порушено ... знайшов цю альтернативу, поглянувши на 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.