Ödülü açtım: "Güvenilir ve / veya resmi kaynaklardan gelen bir cevap arıyorum." ama o zamandan beri böyle bir şey almadım.
@Jackslash tarafından verilen cevap doğru olsa da, hikayenin sadece bir kısmını anlatıyor, bu yüzden bu soruyu sorduğum anda görmek istediğim bir şekilde kendiminkini yazmak istiyorum.
Bu cevabın gerçekliği: Temmuz 2015. Büyük olasılıkla işler değişecek.
Çerçevenin doğru kod imzalama için gerekli eylemler içine Öncelikle edelim assert bölünmüş gerektiğini çerçevenin Geliştirici almak zorunda olduğu adımlar ve bu çerçevenin Tüketici almak zorundadır adımları tekrarlayın.
TLDR;
OSX çerçevesi için: Geliştirici, OSX çerçevesini kod imzalamadan dağıtmakta özgürdür, çünkü Tüketici yine de onu yeniden kodlar.
İOS çerçevesi için: Geliştirici, iOS çerçevesini kod imzalamadan dağıtmakta özgürdür, çünkü Tüketici yine de onu yeniden kodlayacaktır, ancak Geliştirici, iOS cihazı için derlediklerinde çerçevelerini kod imzalamaya Xcode tarafından zorlanmaktadır.
Radar nedeniyle: "Simülatör dilimlerini içeren iOS çerçeveleri App Store'a gönderilemez" iOS çerçevesinin tüketicisi, lipo -remove
simülatör dilimlerini iOS çerçevesinden ayırmak için kullanılan "copy_frameworks" veya "strip_frameworks" gibi özel komut dosyası çalıştırmaya zorlanır ve yeniden -codesigns, çerçeveyi tasarlar çünkü bu noktada kod imzalayan kimliği, ne olursa olsun (veya olmasaydı) lipo -remove
manipülasyonun yan etkisi olarak kaldırılır .
Daha uzun cevap izler.
Bu cevap "güvenilir ve / veya resmi kaynaklardan alınan bir cevap" değil, daha çok bir dizi deneysel gözlemlere dayanmaktadır.
Ampirik gözlem # 1: Tüketici umursamıyor çünkü Geliştiriciden aldıkları çerçeveyi yeniden kodlayacaklar
Github'da iyi bilinen açık kaynaklı projelerin ikili çerçeve dağıtımları kod imzalanmamıştır . Komut şunu codesign -d -vvvv
verir: Keşfetmek için kullandığım tüm ikili iOS ve OSX çerçevelerinde "kod nesnesi hiç imzalanmamış". Bazı örnekler: ReactiveCocoa ve Mantle , Realm , PromiseKit .
Bu gözlemden, bu çerçevelerin yazarlarının, kendi adlarına Tüketici tarafından kod imzalanmasını amaçladıkları açıktır, yani bir Tüketici, Xcode tarafından sağlanan "Göm çerçeveler" derleme aşamasında "Kopyalamada Kod İşareti" bayrağını kullanmalı veya bazı özel kabuklar kullanmalıdır. Aynı şeyi manuel olarak yapan komut dosyası: Müşteri adına kodlar çerçevesi.
Bunun tersinin tek bir örneğini bulamadım: içinde kod imzalayan kimlikle dağıtılacak açık kaynak çerçevesi, bu nedenle yanıtın geri kalanında bu yaygın olarak benimsenen yaklaşımın doğru olduğunu varsayıyorum: Framework Developer'ın Çerçevelerini kod imzalayan kimliği olan diğer geliştiricilere dağıtır çünkü Tüketici yine de onu yeniden kodlar .
Yalnızca iOS için geçerli olan ve tamamen Geliştiricinin endişesi olan 2 numaralı ampirik gözlem
Tüketici onlar codesigned ya da olmasın Geliştirici aldığımız çerçeve umrumda olmasa da, Geliştirici iOS cihazının için oluşturduğunuz hala inşa sürecinin bir parçası olarak iOS çerçevesini codesign gerekiyor aksi Xcode inşa olmadığından: CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'
. AlıntılamakJustin Spahr-Summers'dan :
OS X çerçevelerinin derleme sırasında kod imzalanmasına gerek yoktur ... Maalesef Xcode, iOS çerçevelerinin derleme sırasında kod imzalanmasını gerektirir.
Bu, 2 numaralı soruma oldukça iyi cevaplar: "iPhone Developer" kimliği, Xcode'u cajole etmek için yeterlidir, böylece cihaz için iOS çerçevesi oluşturacaktır. Kartaca # 339 ile ilgili bu yorum aynı şeyi söylüyor.
Ampirik gözlem # 3: Lipo aracı
Lipo aracının özel davranışı: İkili çerçeveye uygulandığında, her zaman kod işareti kimliklerini ondan yinelemeli olarak kaldırır :lipo -create/-remove codesigned framework ... -> not codesigned framework
.
Bu, # 1 numaralı gözlemdeki tüm örneklerin kod imzalanmamasının bir cevabı olabilir: lipo uygulandıktan sonra kodlama kimliği ortadan kalkar, ancak 1 numaralı gözleme göre tüketici umursamadığı için sorun değil.
Bu gözlem özellikle AppStore hakkındaki bir sonraki 4 numaralı gözlemle ilgilidir.
Ampirik gözlem # 4: Simülatör dilimlerini içeren iOS çerçeveleri App Store'a gönderilemez
Bu yaygın olarak tartışılıyor: Bölge # 1163 ve Kartaca # 188 ve radar açılır: rdar: // 19209161 .
Bu tamamen Tüketicinin endişesidir: Tüketicinin uygulamasına dahil ettiği iOS evrensel çerçevesi için, uygulama geliştirilirken, uygulamanın AppStore doğrulamasını geçebilmesi için simülatör dilimini bu çerçevenin ikili dosyasından kaldıran özel komut dosyası (özel Komut Dosyası Çalıştırma Aşaması) çalıştırmaları gerekir.
Realm'de bulduğum ikili çerçeveler için iyi bir örnek: strip-frameworks.sh .
lipo
Dışındaki tüm mimari dilimlerini kaldırmak için kullanır ${VALID_ARCHS}
ve daha sonra bunu Tüketici kimliğiyle yeniden kodlar - işte burada 3 numaralı gözlem devreye girer : çerçeve, üzerindeki lipo manipülasyonları nedeniyle yeniden kodlanacaktır.
Carthage'da CopyFrameworks.swift var Tüketici tarafından dahil edilen tüm çerçevelere aynı şeyi yapan betiğine sahiptir: Simülatör dilimlerini çıkarır ve Tüketici adına çerçeveyi yeniden kodlar.
Ayrıca iyi bir makale var: Xcode'da Dinamik Kitaplıklardan İstenmeyen Mimarileri Çıkarma .
Şimdi hem Geliştiricinin hem de Tüketicinin bakış açısından hem iOS hem de OSX üretmek için gereken adımlara genel bakış. İlk önce daha kolay olanı:
OSX
Geliştirici:
- OSX çerçevesi oluşturur
- Tüketiciye verir
Geliştirici'den hiçbir kod imzalama etkinliği gerekmez.
Tüketici:
- Developer'dan OSX çerçevesini alır
- Çerçeveyi Çerçevelere / dizine kopyalar ve "Kopyalamada Kod İmzası" işleminin bir parçası olarak kendi, Tüketici adına otomatik olarak kod imzalar.
iOS
Geliştirici:
- Cihaz için iOS çerçevesi oluşturur. Xcode için kod imzalama gereklidir, "iPhone Developer" kimliği yeterlidir.
- Simülatör için iOS çerçevesi oluşturur.
- Önceki ikisinden evrensel iOS çerçevesi üreten lipo kullanır. Bu noktada, 1 adımın kod imzalama kimliği kaybolur: evrensel çerçeve ikili "hiç imzalanmaz", ancak "Tüketici umursamadığı" için bu iyidir.
- Tüketiciye verir
Tüketici:
- Geliştiriciden iOS çerçevesi alır
- Çerçeveyi Çerçeveler / dizine kopyalar (bu adım, 3. adımdaki betiğe bağlı olarak gereksiz olabilir.)
- Derleme işleminin bir parçası olarak özel bir komut dosyası kullanır: Bu komut dosyası, iOS çerçevesini kesip çıkarır ve ardından bunu Tüketici adına yeniden kodlar.