IPA'yı (iPhone) yeniden imzalayın


129

Şu anda tüm uygulamalarımı hudson ile xcodebuild ve ardından herhangi bir sorun olmadan bir xcrun kullanarak oluşturuyorum

Kurumsal hesap (uygulama mağazası için veya bazen geçici olarak dağıtılmış) yerine bir kurumsal hesapla yeniden imzalamak istediğim farklı kişilerden birkaç IPA dosyası aldım.

Benim sorunum, uygulamayı terk etmeye çalıştığımda, cihazıma yüklenmeyecek (ve bir Kurumsal yapı olduğu için olmalı). Hata mesajı cihazda (iTunes'da değil) ve bana uygulamayı yükleyemediğini söylüyor. Daha fazla bilgi verilmiyor.

Bazı bilgiler buldum ( http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for- yükle / )

Ve bu mümkün olabilir. Karşılaştığım sorun, mobil ön hazırlık profilini normal derlemelerimde yaptığım gibi (xcrun kullanarak) yerleştirmiyor gibi görünmesidir, bu, kod işareti aracıyla kontrol etmek mümkün mü yoksa xcrun ile yeniden imzalamak mümkün mü ?

İstifa senaryomla şu anda yapıyorum

  • app.ipa dosyasını açın
  • appname = $ (ls Yükü)
  • xcrun -sdk iphoneos PackageApplication -s "$ provizyon_profili" "$ proje_dizini / Yük / $ uygulama adı" -o "$ proje_dizini / app-resigned.ipa" --sign "$ provizyon_profile" --embed "$ mobileprovision"

Ortaya çıkan ipa dosyasına baktım ve orijinal uygulamaya çok benziyor gibi görünüyor. Burada hangi dosyalar gerçekten değişmeli? Başlangıçta _CodeSignature / CodeResources'in değişeceğini düşündüm, ancak içerik hemen hemen aynı görünüyor.

İşaretçiler çok takdir edilmektedir.

Yanıtlar:


212

Sonunda bu işe yaradı!

Ön hazırlık profiline hiçbir cihaz eklenmeden uygulama mağazası gönderimi için cert1 ile imzalanmış bir IPA ile test edilmiştir. Bir kurumsal hesapla imzalanan yeni bir IPA ve kurum içi dağıtım için bir mobil ön hazırlık profiliyle sonuçlanır (mobil ön hazırlık profili IPA'ya yerleştirilir).

Çözüm:

IPA'yı açın

unzip Application.ipa

Eski Kod İmzasını Kaldır

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

Gömülü mobil ön hazırlık profilini değiştirin

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

İstifa etmek

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

Yeniden paket

zip -qr "Application.resigned.ipa" Payload

Düzenleme: Yetki bölümü kaldırıldı (geçit yorumlarına bakın, teşekkürler)


6
Bize sorunlara neden olan bir şey, Entitlements dosyasının, varsa, Apple tarafından sağlanan uygulama kimliğiyle eşleşmesi gerektiğiydi. Paket kimliğini değiştirdiğimizden, yetkiler eşleşmedi. Uygulama çalışır, ancak anahtarlık her çalıştırmadan sonra temizlenir.
tjg184

5
Oleb.net/blog/2011/06/code-signing-changes-in-xcode-4'e göre , uygulama kimliği ikili dosyada yerleşiktir, böylece yalnızca aynı uygulama kimliğini kullanarak istifa edebilirsiniz. Farklı bir uygulama kimliğiyle istifa edemediğimi biliyorum.
Michael Baltaks

7
@ValerioSantinelli Önceki kod imzalamadan gelen yetkileri taşımanız gerekecek. FWIW push bildirimleri yetkiler olmadan çalışmayacaktır. Sıkıştırmadan sonra: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.appArdından, istifa ederken ekleyin--entitlements entitlements.plist
Peter

11
Yosemite'de kod imzası başarısız - Uyarı: --resource-rules, Mac OS X> = 10.10'da kullanımdan kaldırıldı! Payload / Aaa.app / ResourceRules.plist: kaynakları okuyamıyor
Jibeex

4
Uyarı: --resource-rules, Mac OS X> = 10.10'da kullanımdan kaldırılmıştır! Payload / Application.app / ResourceRules.plist: kaynakları okuyamıyor. Bu hatayı mı alıyorsunuz?
megha

44

Bu sorunun yanıtları biraz güncel değil ve potansiyel olarak önemli adımlar eksik, bu nedenle bu, harici bir geliştiriciden bir uygulama yüklemek için güncellenmiş bir kılavuzdur.

----- iOS Uygulaması Nasıl Ayrılır -----

Let Diyelim ki başka bir geliştirici bir uygulamayı (örneğin MyApp.ipa) almak söylemek ve yüklemek mümkün istiyorum ve (kullanarak aygıtlarda çalıştırmak ideviceinstaller örneğin).

Yeni İmza Varlıklarını Hazırlayın

İlk adım, kurmak ve çalıştırmak istediğiniz tüm cihazları içeren bir Ön Hazırlık Profili elde etmektir . Profilin, Anahtar Zinciri Erişiminize yüklediğiniz bir sertifika içerdiğinden emin olun (örn. İPhone Geliştiricisi: Bazı Gövde (XXXXXXXXXX)). Profili (MyProfile.mobileprovision) indirin, böylece uygulamada gömülü profili değiştirebilirsiniz.

Ardından, imzalamaya dahil etmek için bir yetki dosyası hazırlayacağız. Terminalinizi açın ve aşağıdakileri çalıştırın.

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

Bu, Temel Hazırlık Profilinizi açıklayan bir xml dosyası oluşturacaktır . Ardından, yetkileri bir dosyaya çıkarmak istiyoruz.

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

Temel Hazırlık Profilini Değiştirin ve Uygulamadan Çıkın

Eğer bir çalışıyorsanız .ipa dosyası, önce (bir varsa app halletmek .APP yerine, bu adımı atlayabilirsiniz).

$ unzip MyApp.ipa

Çalışma dizininiz şimdi Payload/ve içerecek Payload/MyApp.app/. Ardından, eski kod imza dosyalarını kaldırın.

$ rm -rf Payload/MyApp.app/_CodeSignature

Mevcut ön hazırlık profilini (yani, embedded.mobileprovision) kendinizle değiştirin.

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

Şimdi uygulamayı ön hazırlık profilinizde bulunan sertifika ve daha önce oluşturduğunuz authlements.plist ile imzalayın.

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

ÖNEMLİ: Uygulamaya dahil olan tüm çerçevelerden de vazgeçmelisiniz . Bunları içinde bulacaksınız Payload/MyApp.app/Frameworks. Uygulama Swift ile yazılmışsa veya herhangi bir ek çerçeve içeriyorsa, bunlar iptal edilmelidir, aksi takdirde uygulama yüklenecek ancak çalışmayacaktır.

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

Artık uygulamayı yeniden görüntüleyebilirsiniz.

$ zip -qr MyApp-resigned.ipa Payload

Bitti

PayloadOrijinal uygulamanıza (MyApp.ipa) ve vazgeçtiğiniz sürümünüze (Uygulamam-resigned.ipa) sahip olduğunuz için artık dizini kaldırabilirsiniz . Artık MyApp-resigned.ipa'yı ön hazırlık profilinizde bulunan herhangi bir aygıta yükleyebilirsiniz.


Aynı yaklaşım dağıtım profilleri için de geçerli olacak mı? IE: yetkileri alıp distro.mobile provizyonumdan yeniden imzalayabilir miyim?
Chase Florell

@grez Bu, IPA'ların dağıtımı için de işe yarayacak mı?
LearneriOS

"Kurumsal" uygulama IPA'larının da dağıtımını kastediyorum @grez
LearneriOS

@LearneriOS Bu, Kurumsal IPA Dağıtımı için benim için işe yaramadı. Sierra, Xcode 8, iOS 10 kullanıyorum. Uygulama iTunes aracılığıyla yükleniyor ancak kurulumdan hemen sonra siliniyor.
Bryan Bryce

@PhoenixFF iTunes ile yükleme konusunda emin değilim, ancak şu şekilde komut satırından yüklemeyi deneyebilir misiniz: $ ideviceinstaller -i myapp.ipa
InnisBrendan

11

Bu yanıtı başarılı bir şekilde takip ettim, ancak yetkiler değiştiğinden, --entitlements "Payload/Application.app/Entitlements.plist"saniyeden son cümleye kadar olan kısmı kaldırdım ve harika çalıştı.


Önceki yorumu 2. yapacağım. Bunun modern araç setiyle çalışmasını sağlamak için hakları kaldırın.
Bruno Bronosky

2
Haklar olmadan benim app aslında garip çalışma günlüğüne bu vermeye başladı: SecItemCopyMatching: missing entitlement. Ben o kadar kullandığım haklarını korumak için, ayrı Entitlements.plist dosyanızın olduğunu LordT yorumuna @ önce bir haklar dosyası oluşturmak: echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlements, oturum açarken daha sonra kullanmak: --entitlements temp/newEntitlements.
Bulat

5

Mac OS High Sierra ve Xcode 10 ile kontrol edildi

İResign uygulamasını kullanarak aynısını kolayca uygulayabilirsiniz .

1) .ipa yolunu belirtin

2) Yeni provizyon profili

3) Yetki dosyası (İsteğe bağlı, yalnızca yetkiniz varsa ekleyin)

4) Paket kimliği

5) Dağıtım Sertifikası

Yeniden imzaladıktan sonra kaydedilen çıktı .ipa dosyasını görebilirsiniz

Basit ve güçlü araç


4

Bu istifa yaklaşımlarından hiçbiri benim için işe yaramadı, bu yüzden başka bir şey yapmam gerekti.

Benim durumumda, süresi dolmuş bir sertifikaya sahip bir IPA'm vardı. Uygulamayı yeniden oluşturabilirdim, ancak tam olarak aynı sürümü (sadece yeni bir sertifika ile) dağıttığımızdan emin olmak istediğimiz için, onu yeniden oluşturmak istemedik.

Diğer cevaplarda bahsedilen istifa yolları yerine, Xcode'un bir yapıdan .xcarchive ile başlayan bir IPA oluşturma yöntemine döndüm.

  1. Mevcut bir .xcarchive dosyasını kopyaladım ve içeriğini değiştirmeye başladım. (.DSYM dosyasını görmezden geldim.)

  2. Eski uygulamayı eski IPA dosyasından çıkardım (sıkıştırmayı açarak; uygulama, Payload klasöründeki tek şeydir)

  3. Bu uygulamayı Products/Applicationsorada bulunan uygulamayı değiştirerek yeni .xcarchive'a taşıdım .

  4. Düzenledim Info.plist, düzenledim

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. .Xcarchive dosyasını genellikle Xcode'un arşiv klasörüne taşıdım /Users/xxxx/Library/Developer/Xcode/Archives.

  6. Xcode'da Düzenleyici penceresini açtım, bu yeni arşivi seçtim ve düzenli (bu durumda Enterprise) bir dışa aktarma yaptım.

Sonuç, işe yarayan iyi bir IPA idi.


1
Bu, Xcode 9.2'den itibaren hala çalışan dahice bir çözümdür. Benim durumumda, mevcut .xcarchive altındaki eski .app dosyasını kopyaladım. Info.plist'i değiştirmedim ve bu nedenle uygulama sürümü eski sürüm olarak kaldı ancak yeni kurumsal sertifika ile imzalandı.
dodgy_coder

3

Bence en kolayı Fastlane kullanmak:

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"

Pek çok yolu denedim ama şansım olmadı. Bu çözüm benim için çalıştı, teşekkürler.
Omid Kia

1

Fastlane iç çekişinin istifa seçeneği ile bunu çok kolay bir şekilde yapabilirsiniz.

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

Profili komuttan hemen önce sigh kullanarak da indirebilirsiniz.


0

Bunu postaladığın için teşekkürler Erik. Bu benim için çalıştı. İhtiyacım olan fazladan bir adım hakkında bir not eklemek istiyorum. "Payload / Application.app /" içinde " cacert.pem " adlı bir dosya içeren " CACertChains " adlı bir dizin vardı . Bu adımları tamamlamak için dizini ve .pem'i kaldırmam gerekiyordu. Tekrar teşekkürler! -


-1

Uzantıları olan bir uygulamanız ve / veya bir izleme uygulamanız varsa ve her bir uzantı / izleme uygulaması için birden fazla ön hazırlık profiliniz varsa, ipa dosyasını yeniden imzalamak için bu komut dosyasını kullanmalısınız.

Github'da komut dosyasını yeniden imzalama

İşte bu komut dosyasının nasıl kullanılacağına dair bir örnek:

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

Başka bir -p seçeneği ile ekleyerek diğer uzantı sağlama profillerini de dahil edebilirsiniz.

Benim için - tüm ön hazırlık profilleri aynı sertifika / imza kimliğiyle imzalandı.


Bağlantınız koptu ... yazarın github'ına bakarak bu alternatifi bulun. github.com/fastlane/fastlane/blob/…
jugutier

bu eski bir cevaptır ve artık çalışmadığı için muhtemelen silinmelidir, ancak StackOverflow'da silmenin bir yolu yoktur
RPM

1
Bu bizim için çalıştı, sadece bunun bağlantısını güncellemeniz gerekiyor: github.com/fastlane/fastlane/blob/…
jugutier

Tamam, hala çalıştığını bilmek güzel. Artık orijinal cevabı düzenleyemiyorum, bu yüzden insanlar yorumları okumak zorunda kalacaklar :)
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>.mobileprovisionBunun yerine kullanın .
green0range
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.