Tanda tangani kembali IPA (iPhone)

129

Saat ini saya membangun semua aplikasi saya dengan hudson menggunakan xcodebuild diikuti oleh xcrun tanpa masalah

Saya telah menerima beberapa file IPA dari orang yang berbeda yang ingin saya tandatangani kembali dengan akun perusahaan alih-alih akun perusahaan (untuk app store, atau terkadang didistribusikan secara ad-hoc).

Masalah saya adalah ketika saya mencoba untuk mengundurkan diri dari aplikasi, itu tidak akan menginstal pada perangkat saya (dan itu harus karena itu adalah membangun Enterprise). Pesan kesalahan ada di perangkat (bukan di iTunes) dan itu memberi tahu saya bahwa itu tidak dapat menginstal aplikasi. Tidak ada informasi lagi yang diberikan.

Saya telah menemukan beberapa informasi, ( http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for- unggah / )

Dan ini mungkin saja terjadi. Masalah yang saya hadapi adalah sepertinya tidak menanamkan profil penyediaan seluler seperti yang saya lakukan dengan build normal (menggunakan xcrun) apakah ini mungkin untuk dikontrol dengan alat codesign, atau apakah mungkin untuk masuk kembali dengan xcrun ?

Dengan skrip pengunduran diri saya saat ini saya lakukan

  • unzip app.ipa
  • appname = $ (pays ls)
  • xcrun -sdk iphoneos PackageApplication -s "$ provisioning_profile" "$ project_dir / Payload / $ appname" -o "$ project_dir / app-resigned.ipa" --sign "$ provisioning_profile" --embed "$ mobileprovision"

Saya telah melihat dalam file ipa yang dihasilkan dan tampaknya sangat mirip dengan aplikasi aslinya. File apa yang benar-benar harus diubah di sini? Saya awalnya berpikir bahwa _CodeSignature / CodeResources akan berubah, tetapi kontennya terlihat persis sama.

Pointer sangat dihargai.

Erik
sumber

Jawaban:

212

Akhirnya berhasil!

Diuji dengan IPA yang ditandatangani dengan cert1 untuk pengiriman app store tanpa perangkat yang ditambahkan dalam profil penyediaan. Hasil dalam IPA baru yang ditandatangani dengan akun perusahaan dan profil penyediaan seluler untuk penerapan in-house (profil penyedia seluler akan disematkan ke IPA).

Larutan:

Buka zip IPA

unzip Application.ipa

Hapus CodeSignature lama

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

Ganti profil penyediaan seluler tertanam

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

Mengundurkan diri

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

Paket ulang

zip -qr "Application.resigned.ipa" Payload

Sunting: Menghapus bagian Kepemilikan (lihat komentar lorong, terima kasih)

Erik
sumber
6
Satu hal yang menyebabkan kami masalah adalah file Kepemilikan, jika Anda punya, harus cocok dengan id aplikasi yang disediakan oleh Apple. Karena kami mengubah id bundel, haknya tidak cocok. Aplikasi akan berjalan, tetapi gantungan kunci akan hilang setelah setiap kali dijalankan.
tjg184
5
Menurut oleb.net/blog/2011/06/code-signing-changes-in-xcode-4 ID aplikasi dibangun ke dalam biner, jadi Anda hanya dapat mengundurkan diri menggunakan ID aplikasi yang sama. Saya tahu saya tidak dapat mengundurkan diri dengan ID aplikasi yang berbeda.
Michael Baltaks
7
@ValerioSantinelli Anda harus membawa hak dari penandatanganan kode sebelumnya. Pemberitahuan push FWIW tidak akan berfungsi tanpa hak. Setelah membuka ritsleting: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.appLalu selama pengunduran diri yang mengundurkan diri--entitlements entitlements.plist
Peter
11
codesign gagal pada Yosemite - Peringatan: --resource-aturan sudah tidak digunakan lagi di Mac OS X> = 10.10! Payload / Aaa.app / ResourceRules.plist: tidak dapat membaca sumber daya
Jibeex
4
Peringatan: - aturan sumber daya telah usang di Mac OS X> = 10.10! Payload / Application.app / ResourceRules.plist: tidak dapat membaca sumber daya. Mendapat kesalahan ini?
megha
44

Jawaban atas pertanyaan ini sedikit kedaluwarsa dan kehilangan langkah-langkah kunci yang potensial, jadi ini adalah panduan yang diperbarui untuk menginstal aplikasi dari pengembang eksternal.

----- Cara Mengundurkan Aplikasi iOS -----

Katakanlah Anda menerima aplikasi (mis. MyApp.ipa) dari pengembang lain, dan Anda ingin dapat menginstal dan menjalankannya di perangkat Anda (dengan menggunakan ideviceinstaller , misalnya).

Siapkan Aset Penandatanganan Baru

Langkah pertama adalah mencapai Profil Penyedia yang mencakup semua perangkat yang ingin Anda instal dan jalankan. Pastikan profil tersebut berisi sertifikat yang telah Anda instal di Akses Keychain Anda (mis. Pengembang iPhone: Some Body (XXXXXXXXXX)). Unduh profil (MyProfile.mobileprovision) sehingga Anda dapat mengganti profil yang tertanam di aplikasi.

Selanjutnya, kami akan menyiapkan file hak untuk disertakan dalam penandatanganan. Buka terminal Anda dan jalankan yang berikut ini.

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

Ini akan membuat file xml yang menggambarkan Profil Penyedia Anda . Selanjutnya, kami ingin mengekstraksi hak menjadi file.

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

Ganti Profil Penyedia dan Pengunduran Diri Aplikasi

Jika Anda bekerja dengan file .ipa , pertama-tama, unzip aplikasi (jika Anda memiliki .app , Anda dapat melewati langkah ini).

$ unzip MyApp.ipa

Direktori kerja Anda sekarang akan berisi Payload/dan Payload/MyApp.app/. Selanjutnya, hapus file tanda tangan kode lama.

$ rm -rf Payload/MyApp.app/_CodeSignature

Ganti profil penyediaan yang ada (mis. Embedded.mobileprovision) dengan milik Anda.

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

Sekarang tanda tangani aplikasi dengan sertifikat yang termasuk dalam profil penyediaan Anda dan daftar hak.plist yang Anda buat sebelumnya.

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

PENTING: Anda juga harus mengundurkan diri dari semua kerangka kerja yang termasuk dalam aplikasi . Anda akan menemukan ini di Payload/MyApp.app/Frameworks. Jika aplikasi ini ditulis dalam Swift atau jika ia menyertakan kerangka kerja tambahan ini harus diundurkan atau aplikasi akan menginstal tetapi tidak berjalan.

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

Anda sekarang dapat memposting ulang aplikasi.

$ zip -qr MyApp-resigned.ipa Payload

Selesai

Anda sekarang dapat menghapus Payloaddirektori karena Anda memiliki aplikasi asli Anda (MyApp.ipa) dan versi Anda yang sudah keluar (MyApp-resigned.ipa). Sekarang Anda dapat menginstal MyApp-resigned.ipa di perangkat apa pun yang termasuk dalam profil penyediaan Anda.

InnisBrendan
sumber
Apakah pendekatan yang sama ini berlaku untuk profil distribusi? IE: dapatkah saya mengekstrak hak dan menandatangani ulang dari distro.mobileprovision saya?
Chase Florell
@ grez Apakah ini juga berfungsi untuk distribusi IPA?
LearneriOS
Maksud saya distribusi IPA aplikasi 'enterprise' juga @grez
LearneriOS
@LearneriOS Ini tidak berfungsi untuk saya untuk Distribusi IPA Perusahaan. Saya menggunakan Sierra, Xcode 8, iOS 10. Aplikasi menginstal melalui iTunes tetapi kemudian dihapus segera setelah instalasi.
Bryan Bryce
@PhoenixFF Saya tidak yakin tentang pemasangan dengan iTunes, tetapi dapatkah Anda mencoba menginstal dari baris perintah seperti ini: $ ideviceinstaller -i myapp.ipa
InnisBrendan
11

Saya berhasil mengikuti jawaban ini, tetapi karena hak telah berubah, saya hanya menghapus --entitlements "Payload/Application.app/Entitlements.plist"bagian dari pernyataan kedua ke terakhir, dan itu bekerja seperti pesona.

alleus
sumber
Saya akan 2nd komentar sebelumnya. Hapus kepemilikan untuk menjadikan ini berfungsi dengan toolkit modern.
Bruno Bronosky
2
Tanpa hak app saya benar-benar mulai bekerja aneh, memberikan ini dalam log: SecItemCopyMatching: missing entitlement. Saya tidak punya file Entitlements.plist terpisah, sehingga untuk melestarikan hak saya menggunakan @ komentar LordT ini : pertama membuat file hak: echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlements, kemudian menggunakannya saat penandatanganan: --entitlements temp/newEntitlements.
Bulat
5

Diperiksa dengan Mac OS High Sierra dan Xcode 10

Anda cukup menerapkan hal yang sama menggunakan aplikasi iResign .

Berikan path 1) .ipa

2) profil ketentuan baru

3) File hak (Opsional, tambahkan hanya jika Anda memiliki hak)

4) Bundel id

5) Sertifikat Distribusi

Anda dapat melihat file output .ipa disimpan setelah masuk kembali

Alat sederhana dan kuat

Saranjith
sumber
4

Tidak ada satu pun dari pendekatan pengunduran diri ini yang berhasil untuk saya, jadi saya harus mencari cara lain.

Dalam kasus saya, saya memiliki IPA dengan sertifikat yang kedaluwarsa. Saya dapat membangun kembali aplikasi, tetapi karena kami ingin memastikan bahwa kami mendistribusikan versi yang persis sama (hanya dengan sertifikat baru), kami tidak ingin membangunnya kembali.

Alih-alih cara pengunduran diri yang disebutkan dalam jawaban lain, saya beralih ke metode Xcode untuk membuat IPA, yang dimulai dengan .xcarchive dari build.

  1. Saya menduplikasi .xcarchive yang ada dan mulai mengganti isinya. (Saya mengabaikan file .dSYM.)

  2. Saya mengekstrak aplikasi lama dari file IPA lama (via unzipping; aplikasi itu satu-satunya di folder Payload)

  3. Saya memindahkan aplikasi ini ke .xcarchive baru, dengan Products/Applicationsmengganti aplikasi yang ada di sana.

  4. Saya mengedit Info.plist, mengedit

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. Saya memindahkan .xcarchive ke folder arsip Xcode, biasanya /Users/xxxx/Library/Developer/Xcode/Archives.

  6. Di Xcode, saya membuka jendela Organizer, mengambil arsip baru ini dan melakukan ekspor reguler (dalam hal ini Perusahaan).

Hasilnya adalah IPA bagus yang berfungsi.

Gary Makin
sumber
1
Ini adalah solusi jenius yang masih berfungsi pada Xcode 9.2. Dalam kasus saya, saya hanya menyalin file .app lama di bawah .xcarchive yang ada. Saya tidak mengubah Info.plist sehingga versi aplikasi tetap seperti versi lama tetapi telah ditandatangani dengan sertifikat perusahaan yang baru.
dodgy_coder
3

Saya pikir yang paling mudah adalah dengan menggunakan 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ý
sumber
Saya mencoba banyak cara tetapi tidak berhasil. Solusi ini berhasil buat saya, terima kasih.
Omid Kia
1

Dengan opsi pengunduran diri Fastlane, Anda dapat melakukannya dengan sangat mudah.

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

Anda dapat mengunduh profil menggunakan desahan juga, tepat sebelum perintah.

Vineeth
sumber
0

Terima kasih, Erik, karena memposting ini. Ini berhasil untuk saya. Saya ingin menambahkan catatan tentang langkah tambahan yang saya butuhkan. Di dalam "Payload / Application.app /" ada direktori bernama " CACertChains " yang berisi file bernama " cacert.pem ". Saya harus menghapus direktori dan .pem untuk menyelesaikan langkah-langkah ini. Terima kasih lagi! -

William Power
sumber
-1

Jika Anda memiliki aplikasi dengan ekstensi dan / atau aplikasi arloji dan Anda memiliki beberapa profil penyediaan untuk setiap aplikasi ekstensi / tonton maka Anda harus menggunakan skrip ini untuk menandatangani ulang file ipa.

Menandatangani ulang skrip di Github

Berikut adalah contoh cara menggunakan skrip ini:

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

Anda juga dapat memasukkan profil penyedia ekstensi lainnya dengan menambahkannya dengan opsi -p lainnya.

Bagi saya - semua profil penyediaan ditandatangani oleh sertifikat / identitas penandatanganan yang sama.

RPM
sumber
Tautan Anda rusak ... temukan alternatif ini dengan melihat github penulisnya. github.com/fastlane/fastlane/blob/…
jugutier
ini adalah jawaban lama dan mungkin harus dihapus karena tidak lagi berfungsi tetapi tidak ada cara untuk menghapusnya di StackOverflow
RPM
1
Ini berhasil bagi kami, hanya perlu memperbarui tautan ke ini: github.com/fastlane/fastlane/blob/…
jugutier
ok baik untuk mengetahui bahwa itu masih berfungsi. Tidak dapat mengedit jawaban asli lagi sehingga orang harus membaca komentar :)
RPM
Gunakan 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>.mobileprovisionsebagai gantinya.
green0range