Membuat Kerangka iOS / OSX: Apakah perlu untuk menandatanganinya sebelum didistribusikan ke pengembang lain?

90

Saya belajar cara membuat kerangka kerja iOS dan OSX. Mari kita ambil iOS sebagai contoh, sejauh ini langkah-langkah berikut berhasil untuk saya:

  1. xcodebuild framework menggunakan -sdk iphonesimulator dan tindakan Build
  2. xcodebuild framework menggunakan -sdk iphoneos dan Build action
  3. Gunakan alat lipo untuk membuat biner universal sehingga lipo -infomenghasilkan yang diharapkan:

Arsitektur dalam file lemak: Foo.framework / Foo adalah: i386 x86_64 armv7 arm64

Pertanyaannya adalah:

  1. Saya membaca bahwa kerangka kerja saya dapat ditandatangani ulang oleh pengembang yang menggunakannya: "Masuk Kode pada Salinan" tetapi saya tidak mengerti apa prasyarat untuk itu, yaitu haruskah saya menambahkan langkah kode untuk menandatangani biner universal itu dengan identitas penandatanganan saya sebelumnya mendistribusikannya ke pengembang lain?

  2. jika sebelumnya positif - haruskah saya menggunakan identitas "Distribusi iPhone: ..." atau "Pengembang iPhone: ..." sudah cukup (sehingga framework saya menjadi bagian dari beberapa proyek iOS melewati semua jenis validasi terutama validasi App Store ) ?.

Latar belakang jawaban saya adalah "Kesalahan CodeSign: penandatanganan kode diperlukan untuk jenis produk 'Framework' di SDK 'iOS 8.3'" yang telah saya lihat di sejumlah framework pihak ketiga dan Carthage # 235 atau "objek kode tidak ditandatangani sama sekali "(satu contoh: masalah yang saya laporkan di Realm # 1998 .

Jadi saya ingin memastikan bahwa pengguna kerangka kerja saya tidak akan mengalami masalah penandatanganan kode apa pun saat mereka menggunakannya.

PS Pertanyaan ini menjadi lebih menarik ketika diterapkan bukan untuk pengembang tunggal tetapi untuk organisasi yang merupakan vendor kerangka kerja.

Stanislav Pankevich
sumber
Komentar ini menyarankan penggunaan 'CODE_SIGN_IDENTITY = Pengembang iPhone' tetapi tidak jelas mengapa 'Pengembang' digunakan sebagai pengganti 'Distribusi iPhone'.
Stanislav Pankevich
Topik terkait: Mengekspor aplikasi dengan kerangka kerja yang disematkan tetapi tanpa jawaban yang pasti.
Stanislav Pankevich
Saya juga telah menipu pertanyaan ini di Forum Pengembang Apple: forums.developer.apple.com/thread/6400 .
Stanislav Pankevich
saya punya pertanyaan ketika Anda mendistribusikan kerangka kerja Anda, Anda mendistribusikan membangun debug atau rilis membangun? dan jika Anda mendistribusikannya dalam rilis build, bagaimana cara melakukannya?
niczm25
@ niczm25, ini salah satu cara saya melakukannya: stanislaw.github.io/2015/11/23/… .
Stanislav Pankevich

Jawaban:

137

Saya membuka bounty: "Mencari gambar jawaban dari sumber yang kredibel dan / atau resmi." tetapi belum menerima itu sejak saat itu.

Meskipun jawaban yang diberikan oleh @jackslash benar, ini hanya menceritakan sebagian dari cerita jadi saya ingin menulis sendiri dengan cara yang saya ingin lihat saat saya mengajukan pertanyaan ini.

Kenyataan dari jawaban ini adalah: Juli 2015. Kemungkinan besar segalanya akan berubah.

Pertama-tama mari kita tegaskan bahwa tindakan yang diperlukan untuk penandatanganan kode kerangka kerja yang benar harus dibagi menjadi langkah-langkah yang harus diambil oleh Pengembang kerangka kerja dan langkah-langkah yang harus diambil Konsumen kerangka kerja.

TLDR;

Untuk kerangka kerja OSX: Pengembang bebas mendistribusikan kerangka kerja OSX tanpa menandatanganinya karena Konsumen akan tetap menandatanganinya.

Untuk kerangka kerja iOS: Pengembang bebas untuk mendistribusikan kerangka kerja iOS tanpa menandatanganinya karena Konsumen akan tetap menandatanganinya, tetapi Pengembang dipaksa oleh Xcode untuk menandatangani kerangka kerja mereka ketika mereka membangun untuk perangkat iOS.

Karena radar: "kerangka kerja iOS yang berisi irisan simulator tidak dapat dikirimkan ke App Store" Konsumen kerangka iOS dipaksa untuk menjalankan skrip khusus seperti "copy_frameworks" atau "strip_frameworks" yang digunakan lipo -removeuntuk menghapus irisan simulator dari kerangka kerja iOS dan -codesigns dilucuti kerangka karena pada titik ini identitas penandatanganan kode apa pun itu (atau tidak) dihapus sebagai efek samping lipo -removemanipulasi.

Jawaban yang lebih panjang mengikuti.


Jawaban ini bukanlah "penarikan dari sumber yang kredibel dan / atau resmi" tetapi lebih didasarkan pada sejumlah observasi empiris.

Pengamatan empiris # 1: Konsumen tidak peduli karena mereka akan membuat kode ulang kerangka kerja yang mereka terima dari Pengembang

Distribusi kerangka biner dari proyek sumber terbuka terkenal di Github tidak diberi tanda kode . Perintah codesign -d -vvvvmemberikan: "objek kode tidak ditandatangani sama sekali" pada semua kerangka kerja iOS dan OSX biner yang biasa saya jelajahi. Beberapa contoh: ReactiveCocoa and Mantle , Realm , PromiseKit .

Dari pengamatan ini jelas bahwa penulis kerangka kerja ini bermaksud agar mereka diberi tanda kode oleh Konsumen, atas nama mereka yaitu Konsumen harus menggunakan bendera "Tanda Kode Saat Disalin" dalam fase pembuatan "kerangka kerja Sematkan" yang disediakan oleh Xcode atau menggunakan beberapa kerangka khusus script yang melakukan hal yang sama secara manual: kerangka kode tanda tangan atas nama Konsumen.

Saya tidak menemukan satu pun contoh yang sebaliknya: kerangka kerja sumber terbuka yang akan didistribusikan dengan identitas penandatanganan kode di dalamnya sehingga di sisa jawaban saya mengasumsikan pendekatan yang diadopsi secara luas ini sebagai yang benar: tidak perlu pengembang kerangka kerja untuk mendistribusikan kerangka kerja mereka ke pengembang lain dengan identitas penandatanganan kode di dalamnya karena Konsumen tetap akan menandatanganinya ulang .

Pengamatan empiris # 2 yang hanya berlaku untuk iOS dan yang sepenuhnya menjadi perhatian Pengembang

Sementara Konsumen tidak peduli apakah kerangka yang mereka terima dari Pengembang codesigned atau tidak, Pengembang masih perlu codesign kerangka iOS mereka sebagai bagian dari proses membangun ketika mereka membangun untuk perangkat iOS karena jika tidak Xcode tidak membangun: CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'. Mengutip Justin Spahr-Summers :

Kerangka OS X tidak perlu diberi tanda kode saat pembuatan ... Sayangnya, Xcode memang mengharuskan kerangka kerja iOS diberi tanda kode pada saat pembuatan.

Ini cukup menjawab pertanyaan saya # 2: Identitas "Pengembang iPhone" sudah cukup untuk membujuk Xcode sehingga akan membangun kerangka kerja iOS untuk perangkat. Komentar di Kartago # 339 ini mengatakan hal yang sama.

Pengamatan empiris # 3: alat lipo

Perilaku tertentu dari alat lipo: bila diterapkan kerangka biner, selalu rekursif menghapus setiap identitas codesign dari itu : lipo -create/-remove codesigned framework ... -> not codesigned framework.

Ini bisa menjadi jawaban mengapa semua contoh dalam observasi # 1 sama sekali tidak diberi tanda kode: identitas penandatanganan kode mereka hilang setelah lipo diterapkan tetapi karena menurut pengamatan # 1 Konsumen tidak peduli itu baik-baik saja.

Pengamatan ini sangat relevan dengan pengamatan # 4 berikutnya tentang AppStore.

Pengamatan empiris # 4: Framework iOS yang berisi irisan simulator tidak dapat dikirimkan ke App Store

Ini dibahas secara luas di: Realm # 1163 dan Carthage # 188 dan radar dibuka: rdar: // 19209161 .

Ini sepenuhnya menjadi perhatian Konsumen: untuk kerangka kerja universal iOS yang disertakan Konsumen dalam aplikasinya, ketika aplikasi sedang dibangun, mereka harus menjalankan skrip khusus (Fase Jalankan Skrip khusus) yang menghapus potongan simulator dari biner kerangka kerja tersebut sehingga aplikasi dapat melewati validasi AppStore.

Contoh bagus untuk kerangka kerja biner yang saya temukan di Realm: strip-frameworks.sh .

Ini digunakan lipountuk menghapus semua irisan arsitektur selain ${VALID_ARCHS}dan kemudian menandainya kembali dengan identitas Konsumen - di sinilah observasi # 3 dimulai: kerangka harus diberi kode ulang karena manipulasi lipo di atasnya.

Carthage memiliki skrip CopyFrameworks.swift yang melakukan hal yang sama ke semua kerangka kerja yang disertakan oleh Konsumen: ini menghapus kerangka simulator dan kerangka kode ulang atas nama Konsumen.

Juga ada artikel bagus: Melucuti Arsitektur Yang Tidak Diinginkan Dari Perpustakaan Dinamis Di Xcode .


Sekarang gambaran umum langkah-langkah yang diperlukan untuk menghasilkan iOS dan OSX dari perspektif Pengembang dan Konsumen. Pertama yang lebih mudah:

OSX

Pengembang:

  1. Membangun kerangka OSX
  2. Memberikannya kepada Konsumen

Tidak ada aktivitas penandatanganan kode yang diperlukan dari Pengembang.

Konsumen:

  1. Menerima kerangka OSX dari Pengembang
  2. Menyalin kerangka kerja ke Kerangka / direktori dan kode menandatanganinya secara otomatis atas, Konsumen, nama mereka sebagai bagian dari proses "Kode Masuk pada Salinan".

iOS

Pengembang:

  1. Membangun kerangka iOS untuk perangkat. Penandatanganan kode diperlukan oleh Xcode, identitas "Pengembang iPhone" sudah cukup.
  2. Membangun kerangka iOS untuk simulator.
  3. Menggunakan lipo yang menghasilkan kerangka iOS universal dari dua sebelumnya. Pada titik ini identitas penandaan kode dari 1 langkah hilang: kerangka kerja universal biner "tidak ditandatangani sama sekali" tetapi tidak masalah karena "Konsumen tidak peduli".
  4. Memberikannya kepada Konsumen

Konsumen:

  1. Menerima kerangka kerja iOS dari Pengembang
  2. Menyalin kerangka kerja ke direktori Frameworks / (langkah ini mungkin berlebihan tergantung pada skrip apa di langkah 3.)
  3. Menggunakan skrip khusus sebagai bagian dari proses build: simulator strip skrip ini memotong kerangka iOS dan kemudian menandainya ulang atas nama, Konsumen, mereka.
Stanislav Pankevich
sumber
9
Ini adalah tulisan yang berharga. Bagus
jackslash
@Stanislaw terima kasih atas wawasan dan datanya yang berharga. Ketika saya menulis kerangka kerja yang saya rancang sendiri untuk pengembang, saya ingin mereka dapat menggunakan kerangka kerja sebagaimana adanya dan menggunakannya tanpa perlu membuat skrip khusus untuk mengunggah ke app-store. Saya pikir GoogleMobileAd bekerja seperti itu. tetapi Anda mengatakan mereka harus menjalankan skrip tertentu? Anda tahu bagaimana GoogleMobileAds tidak mengharuskan itu? terima kasih
Michael A
@MichaelA, memang itu menarik. Saya akan melihat.
Stanislav Pankevich
Bisakah Anda memberi saya tautan ke GoogleMobileAds yang Anda gunakan?
Stanislav Pankevich
1
Terima kasih telah menghemat waktu saya, itu berhasil untuk saya. Xcode 7.3, Mac OS X 10.11.4.
eugen
21

Dari membaca utas tertaut di repo Carthage tampaknya relatif sederhana. Jika Anda mendistribusikan kerangka biner, Anda perlu memberi kode untuk menandatanganinya dan jika Anda mendistribusikan sumber melalui carthage atau buah kakao, Anda tidak karena alat tersebut menangani hal ini melalui metode yang berbeda.

Alasan Anda perlu menandatanganinya saat Anda mendistribusikan kerangka biner adalah karena Xcode tidak akan menghasilkan biner kerangka kerja tanpa penandatanganan kode. Jika Anda mencoba untuk tidak menandatangani kode kerangka biner, Anda mendapatkan kesalahan ini:

CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'

Tidak masalah identitas mana yang Anda beri kode untuk menandatangani kerangka kerja (Pengembang iPhone atau Distribusi iPhone) karena, seperti yang Anda tunjukkan, kerangka kerja akan diberi tanda kode ulang dengan pengaturan "tanda kode pada salinan". Artinya, kerangka kerja Anda akan diberi tanda kode ulang oleh sertifikat yang sesuai dari profil pengembang konsumen kerangka kerja saat kerangka Anda disalin ke dalam aplikasi mereka. Ini berarti tidak akan ada masalah dengan App Store karena hanya akan melihat tanda tangan kode akhir dari konsumen framework.

Pada akhirnya, Anda mungkin juga akan menandatangani kode biner .framework Anda karena Anda tidak ingin harus mempertahankan proses build yang eksotis, dan karena Xcode hanya akan mengeluarkan kerangka kerja yang ditandatangani, Anda tidak boleh bergerak terlalu jauh dari default. Itu tidak terlalu penting karena konsumen akhir akan menandatanganinya kembali.

jackslash
sumber
dalam jawaban Anda, di paragraf kedua, Anda mengatakan bahwa tidak perlu kerangka kode karena akan ditandatangani ulang oleh konsumen dan saya juga sekarang 95% yakin itu benar, tetapi saya tidak mengerti mengapa pada saat yang sama di paragraf pertama Anda mengatakan: "Jika Anda mendistribusikan kerangka biner, Anda perlu memberi kode untuk menandatanganinya" - apa bedanya - jika saya mendistribusikan kerangka biner (yaitu bukan sumbernya melalui carthage atau cocoapods) mengapa Saya perlu menandatanganinya?
Stanislav Pankevich
Saya rasa saya seharusnya tidak membuat kode kerangka saya, apa pun jenis distribusi yang saya gunakan (file zip .framework atau carthage atau cocoapods). Contoh: semua distribusi kerangka biner berikut tidak bertanda kode: Realm , ReactiveCocoa , OCMockito .
Stanislav Pankevich
Jadi saya agak bingung dengan "Jika Anda mendistribusikan kerangka biner, Anda perlu menandatanganinya" yang (imho) bertentangan dengan sisa jawaban Anda. Mohon klarifikasi. Juga harap dicatat bahwa saya membuka bounty ini sebagai "Mencari gambar jawaban dari sumber yang kredibel dan / atau resmi.".
Stanislav Pankevich
1
Ya, saya juga melihat Realm dan OCMockito. Realm memiliki identitas "Pengembang iPhone" dan ya, OCMockito adalah perpustakaan statis. Saya rasa saya mengerti masalahnya - ini adalah lipo yang menghapus kode dari iphoneos saat menggabungkan iphoneos bertanda kode dan iphonesimulator yang tidak bertanda kode.
Stanislav Pankevich
1
saya punya pertanyaan ketika Anda mendistribusikan kerangka kerja Anda, Anda mendistribusikan membangun debug atau rilis membangun? dan jika Anda mendistribusikannya dalam rilis build, bagaimana cara melakukannya?
niczm25
1

Jawaban Stanislav Pankevich di atas sangat valid dan benar. Namun harap diperhatikan bahwa mulai Xcode 9.4, IDE akan meminta Anda untuk menonaktifkan penandatanganan kode untuk iOS Cocoa Touch Frameworks. Apple di sini sekarang mengatakan tidak disarankan Anda menandatangani kode .framework Anda.

Saya harap ini membantu.

Dino Alves
sumber
1
Apakah Anda memiliki sumber untuk Apple yang merekomendasikan untuk tidak menandatangani kerangka kerja?
Rick