Podpisz ponownie IPA (iPhone)

131

Obecnie wszystkie moje aplikacje buduję w hudson, używając xcodebuild, a następnie xcrun bez żadnych problemów

Otrzymałem kilka plików IPA od różnych osób, które chciałbym ponownie podpisać za pomocą konta korporacyjnego zamiast konta firmowego (dla sklepu z aplikacjami lub czasami dystrybuowanych ad-hoc).

Mój problem polega na tym, że gdy próbuję zrezygnować z aplikacji, nie zainstaluje się ona na moim urządzeniu (a powinno, ponieważ jest to wersja Enterprise). Komunikat o błędzie znajduje się na urządzeniu (nie w iTunes) i informuje mnie po prostu, że nie można zainstalować aplikacji. Nie podano więcej informacji.

Znalazłem informacje, ( http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for- upload / )

A to może być możliwe. Problem, z którym się zmagam, polega na tym, że wydaje się, że nie wydaje się osadzać mobilnego profilu obsługi administracyjnej, tak jak robię to w przypadku moich normalnych kompilacji (przy użyciu xcrun), czy można to kontrolować za pomocą narzędzia do kodowania, czy też można ponownie podpisać za pomocą xcrun ?

Obecnie wykonuję mój skrypt rezygnacji

  • rozpakuj 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" --embed "$ mobileprovision"

Przejrzałem wynikowy plik ipa i wydaje się, że jest bardzo podobny do oryginalnej aplikacji. Jakie pliki naprawdę powinny się tutaj zmienić? Początkowo myślałem, że _CodeSignature / CodeResources ulegnie zmianie, ale zawartość wygląda prawie tak samo.

Wskaźniki są bardzo cenione.

Erik
źródło

Odpowiedzi:

213

Wreszcie zadziałało!

Przetestowano przy użyciu adresu IPA podpisanego przy użyciu cert1 do przesyłania do sklepu z aplikacjami bez dodania urządzeń do profilu aprowizacji. Rezultatem jest podpisanie nowego IPA z kontem przedsiębiorstwa i mobilnym profilem aprowizacji do wdrożenia wewnętrznego (mobilny profil aprowizacji zostaje osadzony w IPA).

Rozwiązanie:

Rozpakuj IPA

unzip Application.ipa

Usuń stary CodeSignature

rm -r "Payload/Application.app/_CodeSignature" "Payload/Application.app/CodeResources" 2> /dev/null | true

Zastąp osadzony mobilny profil obsługi administracyjnej

cp "MyEnterprise.mobileprovision" "Payload/Application.app/embedded.mobileprovision"

Rezygnować

/usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

Zapakuj ponownie

zip -qr "Application.resigned.ipa" Payload

Edycja: Usunięto część Entitlement (patrz komentarz alejki, dzięki)

Erik
źródło
6
Jedną z rzeczy, które spowodowały problemy, było to, że plik uprawnień, jeśli taki masz, musi być zgodny z identyfikatorem aplikacji dostarczonym przez Apple. Ponieważ zmienialiśmy identyfikator pakietu, uprawnienia nie są zgodne. Aplikacja działałaby, ale pęku kluczy usuwał się po każdym uruchomieniu.
tjg184
5
Według oleb.net/blog/2011/06/code-signing-changes-in-xcode-4 identyfikator aplikacji jest wbudowany w plik binarny, więc możesz zrezygnować tylko z tym samym identyfikatorem aplikacji. Wiem, że nie mogłem zrezygnować z innego identyfikatora aplikacji.
Michael Baltaks,
7
@ValerioSantinelli Będziesz musiał przenieść uprawnienia z poprzedniego podpisania kodu. Powiadomienia push FWIW nie będą działać bez uprawnień. Po rozpakowaniu: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.appNastępnie podczas rezygnacji dodaj--entitlements entitlements.plist
Piotr
11
Codesign nie działa w Yosemite - Ostrzeżenie: --resource-rules jest przestarzałe w Mac OS X> = 10.10! Payload / Aaa.app / ResourceRules.plist: nie można odczytać zasobów
Jibeex
4
Ostrzeżenie: --resource-rules jest przestarzałe w Mac OS X> = 10.10! Payload / Application.app / ResourceRules.plist: nie można odczytać zasobów. Otrzymujesz ten błąd?
megha
45

Odpowiedzi na to pytanie są trochę nieaktualne i nie zawierają potencjalnie kluczowych kroków, dlatego jest to zaktualizowany przewodnik dotyczący instalowania aplikacji od zewnętrznego programisty.

----- Jak zrezygnować z aplikacji na iOS -----

Załóżmy, że otrzymujesz aplikację (np. MyApp.ipa) od innego programisty i chcesz mieć możliwość jej zainstalowania i uruchomienia na swoich urządzeniach ( na przykład za pomocą ideviceinstaller ).

Przygotuj nowe zasoby do podpisywania

Pierwszym krokiem jest uzyskanie profilu obsługi administracyjnej, który obejmuje wszystkie urządzenia, które chcesz zainstalować i na których chcesz działać. Upewnij się, że profil zawiera certyfikat, który zainstalowałeś w swoim Keychain Access (np. IPhone Developer: Some Body (XXXXXXXXXX)). Pobierz profil (MyProfile.mobileprovision), aby móc zastąpić profil osadzony w aplikacji.

Następnie przygotujemy plik uprawnień do podpisania. Otwórz terminal i uruchom następujące.

$ security cms -D -i path/to/MyProfile.mobileprovision > provision.plist

Spowoduje to utworzenie pliku XML opisującego profil obsługi administracyjnej . Następnie chcemy wyodrębnić uprawnienia do pliku.

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

Wymień profil obsługi administracyjnej i zrestartuj aplikację

Jeśli pracujesz z plikiem .ipa , najpierw rozpakuj aplikację (jeśli masz zamiast tego .app , możesz pominąć ten krok).

$ unzip MyApp.ipa

Twój katalog roboczy będzie teraz zawierał Payload/i Payload/MyApp.app/. Następnie usuń stare pliki podpisów kodu.

$ rm -rf Payload/MyApp.app/_CodeSignature

Zastąp istniejący profil informacyjny (tj. Embedded.mobileprovision) własnym.

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

Teraz podpisz aplikację za pomocą certyfikatu zawartego w Twoim profilu informacyjnym i utworzonej wcześniej encyklopedii entity.plist.

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app

WAŻNE: musisz również zrezygnować ze wszystkich frameworków zawartych w aplikacji . Znajdziesz je w Payload/MyApp.app/Frameworks. Jeśli aplikacja jest napisana w języku Swift lub zawiera dodatkowe frameworki, należy je zrezygnować, w przeciwnym razie aplikacja zostanie zainstalowana, ale nie będzie działać.

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app/Frameworks/*

Możesz teraz ponownie załadować aplikację.

$ zip -qr MyApp-resigned.ipa Payload

Gotowe

Możesz teraz usunąć Payloadkatalog, ponieważ masz oryginalną aplikację (MyApp.ipa) i wersję, z której zrezygnowałeś (MyApp-resigned.ipa). Możesz teraz zainstalować MyApp-resigned.ipa na dowolnym urządzeniu uwzględnionym w Twoim profilu informacyjnym.

InnisBrendan
źródło
Czy to samo podejście będzie miało zastosowanie do profili dystrybucji? IE: czy mogę wyodrębnić uprawnienia i ponownie podpisać z mojej distro.mobileprovision?
Chase Florell
@grez Czy to zadziała również w przypadku dystrybucji IPA?
LearneriOS,
Mam na myśli dystrybucję IPA aplikacji dla przedsiębiorstw, a także @grez
LearneriOS
@LearneriOS To nie działa dla mnie w przypadku dystrybucji Enterprise IPA. Używam Sierra, Xcode 8, iOS 10. Aplikacja jest instalowana przez iTunes, ale zaraz po instalacji zostaje usunięta.
Bryan Bryce,
@PhoenixFF Nie jestem pewien co do instalacji z iTunes, ale czy możesz spróbować zainstalować z wiersza poleceń w następujący sposób: $ ideviceinstaller -i myapp.ipa
InnisBrendan
11

Z powodzeniem zastosowałem się do tej odpowiedzi, ale ponieważ uprawnienia się zmieniły, po prostu usunąłem --entitlements "Payload/Application.app/Entitlements.plist"część przedostatniej wypowiedzi i zadziałało to jak urok.

alleus
źródło
Dodam poprzedni komentarz. Usuń uprawnienia, aby ten działał z nowoczesnym zestawem narzędzi.
Bruno Bronosky
2
Bez uprawnień moja aplikacja faktycznie rozpoczął pracę dziwne, daje to w dzienniku: SecItemCopyMatching: missing entitlement. I nie ma osobny plik Entitlements.plist, tak aby zachować uprawnienia użyłem @ komentarzu LordT za : najpierw utworzyć plik uprawnień: echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlements, a następnie użyć go podczas podpisywania: --entitlements temp/newEntitlements.
Bulat
6

Myślę, że najłatwiej jest skorzystać z 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"
Marián Černý
źródło
Próbowałem wielu sposobów, ale bez powodzenia. To rozwiązanie zadziałało u mnie dzięki.
Omid Kia
5

Sprawdzono w systemie Mac OS High Sierra i Xcode 10

Możesz po prostu zaimplementować to samo za pomocą aplikacji iResign .

Podaj ścieżkę 1) .ipa

2) Nowy profil prowizyjny

3) Plik uprawnień (opcjonalnie, dodaj tylko wtedy, gdy masz uprawnienia)

4) Identyfikator pakietu

5) Certyfikat dystrybucji

Możesz zobaczyć wyjściowy plik .ipa zapisany po ponownym podpisaniu

Proste i wydajne narzędzie

Saranjith
źródło
4

Żadne z tych rezygnujących podejść nie działało na mnie, więc musiałem wypracować coś innego.

W moim przypadku miałem IPA z wygasłym certyfikatem. Mogłem odbudować aplikację, ale ponieważ chcieliśmy mieć pewność, że dystrybuujemy dokładnie tę samą wersję (tylko z nowym certyfikatem), nie chcieliśmy jej odbudowywać.

Zamiast sposobów rezygnacji z innych odpowiedzi, zwróciłem się do metody Xcode tworzenia IPA, która zaczyna się od pliku .xcarchive z builda.

  1. Zduplikowałem istniejący plik .xcarchive i zacząłem zastępować zawartość. (Zignorowałem plik .dSYM.)

  2. Wyodrębniłem starą aplikację ze starego pliku IPA (przez rozpakowanie; aplikacja jest jedyną rzeczą w folderze Payload)

  3. Przeniosłem tę aplikację do nowego .xcarchive, Products/Applicationszastępując istniejącą tam aplikację.

  4. Redagowałem Info.plist, redagowałem

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. Zwykle przenosiłem .xcarchive do folderu archiwum Xcode /Users/xxxx/Library/Developer/Xcode/Archives.

  6. W Xcode otworzyłem okno Organizatora, wybrałem to nowe archiwum i wykonałem regularny (w tym przypadku Enterprise) eksport.

Rezultatem było dobre IPA, które działa.

Gary Makin
źródło
1
To genialne rozwiązanie, które nadal działa od wersji Xcode 9.2. W moim przypadku po prostu skopiowałem stary plik .app do istniejącego .xcarchive. Nie zmieniłem Info.plist, więc wersja aplikacji pozostała stara, ale została podpisana nowym certyfikatem przedsiębiorstwa.
dodgy_coder
1

Dzięki opcji rezygnacji Fastlane możesz to zrobić bardzo łatwo.

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

Możesz pobrać profil również za pomocą westchnienia, tuż przed komendą.

Vineeth
źródło
1

W 2020 roku zrobiłem to z Fastlane -

Oto polecenie, którego użyłem

$ 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

Pełna dokumentacja tutaj - https://docs.fastlane.tools/actions/resign/

Pankaj Saini
źródło
0

Dziękuję Erik za opublikowanie tego. To zadziałało dla mnie. Chciałbym dodać uwagę na temat dodatkowego kroku, którego potrzebowałem. W „Payload / Application.app /” znajdował się katalog o nazwie „ CACertChains ”, który zawierał plik o nazwie „ cacert.pem ”. Musiałem usunąć katalog i .pem, aby wykonać te czynności. Dzięki jeszcze raz! -

William Power
źródło
0

Wypróbowałem wszystkie rozwiązania, ale w końcu jestem w stanie stworzyć zrezygnować ipa za pomocą tych poleceń

Rezygnacja z certyfikatów

  • * to nazwa ipa, a także nazwa aplikacji $ PROVISION to ścieżka do profilu zaopatrzenia $ CERTIFICATE to nazwa certyfikatu w łańcuchu kluczy pełna nazwa (nazwa zwyczajowa po dwukrotnym kliknięciu certyfikatu)
  1. Przejdź do katalogu, w którym chcesz utworzyć nowy ipa z certyfikatami rezygnacji. Przeprowadź tam wszystkie pliki ipa, certificate i mobileprovision, a także zainstaluj certyfikat

  2. security cms -D -i ścieżka / do / MyProfile.mobileprovision> Provision.plist (Wywołaj to polecenie i zastąp mobilną rezerwację ścieżką do pliku)

  3. / usr / libexec / PlistBuddy -x -c 'Drukuj: Entitlements' Provision.plist> quallements.plist (naciśnij to polecenie)

  4. unzip -q * .ipa

  5. rm -rf Payload / *. app / _CodeSignature /

  6. / usr / libexec / PlistBuddy Payload / *. app / Info.plist (po tym poleceniu musimy dodać nowy identyfikator pakietu, jeśli nie musimy zmieniać identyfikatora pakietu, możemy zignorować te 3 kroki)

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

  2. Codesign -d --entitlements: quallements.plist Payload / *. app / (Spróbuj zignorować to polecenie, jeśli aplikacja nie działa, a następnie użyj tego polecenia następnym razem)

  3. codeign -f -s "$ CERTIFICATE" --entitlements quallements.plist Ładunek / .app / Frameworks /

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

  5. zip -qr resigned.ipa Ładunek

https://stackoverflow.com/a/37172815 https://stackoverflow.com/a/50392448 https://coderwall.com/p/qwqpnw/resign-ipa-with-new-cfbundleidentifier-and-certificate

Gurinder Batth
źródło
-1

Jeśli masz aplikację z rozszerzeniami i / lub aplikację zegarka i masz wiele profili aprowizacji dla każdego rozszerzenia / aplikacji zegarka, użyj tego skryptu, aby ponownie podpisać plik ipa.

Ponowne podpisywanie skryptu na Github

Oto przykład użycia tego skryptu:

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

Możesz również dołączyć inne profile obsługi rozszerzeń, dodając je z jeszcze jedną opcją -p.

Dla mnie - wszystkie profile aprowizacji zostały podpisane tym samym certyfikatem / tożsamością podpisu.

RPM
źródło
Twój link jest uszkodzony ... znalazłem tę alternatywę, patrząc na github autora. github.com/fastlane/fastlane/blob/…
jugutier
to jest stara odpowiedź i prawdopodobnie powinna zostać usunięta, ponieważ już nie działa, ale nie ma sposobu, aby ją usunąć w StackOverflow
RPM
1
To zadziałało dla nas, wystarczy zaktualizować link do tego: github.com/fastlane/fastlane/blob/ ...
jugutier
ok dobrze wiedzieć, że nadal działa. Nie mogę już edytować oryginalnej odpowiedzi, więc ludzie będą musieli czytać komentarze :)
RPM
Użyj 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>.mobileprovisionzamiast tego.
green0range