Saya belajar cara membuat kerangka kerja iOS dan OSX. Mari kita ambil iOS sebagai contoh, sejauh ini langkah-langkah berikut berhasil untuk saya:
- xcodebuild framework menggunakan -sdk iphonesimulator dan tindakan Build
- xcodebuild framework menggunakan -sdk iphoneos dan Build action
- Gunakan alat lipo untuk membuat biner universal sehingga
lipo -info
menghasilkan yang diharapkan:
Arsitektur dalam file lemak: Foo.framework / Foo adalah: i386 x86_64 armv7 arm64
Pertanyaannya adalah:
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?
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.
sumber
Jawaban:
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 -remove
untuk 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 sampinglipo -remove
manipulasi.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 -vvvv
memberikan: "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 :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
lipo
untuk 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:
Tidak ada aktivitas penandatanganan kode yang diperlukan dari Pengembang.
Konsumen:
iOS
Pengembang:
Konsumen:
sumber
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.
sumber
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.
sumber