iOS Statik ve Dinamik çerçeveler açıklamaları


115

İtiraf etmeliyim ki iOS 8'in piyasaya sürülmesiyle iOS'taki dinamik ve statik çerçeveler konusunda biraz kafam karıştı.

Oluşturduğum bir kitaplığı dağıtmanın bir yolunu arıyorum ve iOS 7 ve üstünü desteklemem gerekiyor. (Not: Bu, tescilli bir çerçeve olacaktır. Kakao kapsüllerini kullanamam ve kaynağı da dağıtamam). İşte zaten bildiğim şey:

  • iOS 8, iOS için "gömülü çerçeveler" sundu, ancak anladığım kadarıyla bunlar iOS 7 için değil, yalnızca iOS 8 ve üzeri için çalışmıyor.
  • Kitaplığımı statik kitaplık (.a dosyası) olarak dağıtma ve ayrıca başlıkları dağıtma seçeneğim var. Bunun durumla başa çıkmanın yaygın bir yolu olduğunu biliyorum, ancak bundan daha basit bir şey bulmak istiyorum (ve mümkünse bazı kaynakları bununla birleştirmek de istiyorum).
  • Ayrıca iOS 7'nin dinamik .framework kitaplıklarını (yalnızca statik) desteklemediğini, çünkü dinamik bağlamayı desteklemediğini buldum. Ancak iOS 8, statik bağlantının yanı sıra bunu yapıyor.

Ve işte bu bilgilerle ilgili sorularım:

  • Mach-O türünü "statik kitaplık" olarak değiştirerek bir .framework hedefi oluşturabileceğimi ve bunu statik hale getirebileceğimi gördüm. Bu, iOS 7'yi sorunsuz bir şekilde desteklemek ve kitaplığımı bir .framework paketi Öyleyse, internetteki birçok kaynağın önerdiği gibi iOS 8'deki "gömülü çerçeveler" neden bu kadar önemli?
  • Yaptığım diğer uygulamalarda yaptığım gibi .framework için kod imzalamak gerekli mi?
  • .Framework dosyama başka kaynakları (Temel Veriler veya Görseller gibi) eklemem gerekirse ne olur? Bunun için ayrı bir .bundle dosyası oluşturmam gerekecek mi?

1
"iOS 7, dinamik bağlamayı desteklemediği için .framework kitaplıklarını desteklemez" Bu ifade doğru değil.
Midhun MP

1
Anlıyorum. bana doğru cümleyi söyleyebilir misin? Yanlış mı çünkü iOS 7 dinamik bağlantıyı desteklediğinden veya iOS 7 .framework kitaplıklarını desteklediğinden mi? Ya da her ikisi de?
csotiriou

1
Remeber AVFoundation ve CoreGraphics, hepsi .framework. Muhtemelen bu, tüm sorularınızın yanıtlarını bulmanıza yardımcı olur: raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP

Cümleyi düzelttim. Sorularımı göndermeden önce bağlantıyı zaten okudum. Bu bağlantı sorularımla ilgili hiçbir şey açıklamıyor. Statik bir kitaplıktan başlar ve onu bir .framework dosyasına MANUEL OLARAK sarar. Xcode 6'da bir Cocoa Touch Framework hedefinden bahsediyorum ve ardından türü statik bir kitaplığa değiştiriyorum. Kod imzalamadan (neden ve gerekliyse), ek kaynaklardan vb.
Bahsetmiyor

1
CocoaPods'u tescilli bir çerçeve dağıtmak için kullanabilirsiniz (ör. Parse)
Ric Santos

Yanıtlar:


69

İOS8'den önce, Xcode yalnızca iOS için statik kitaplıklar oluşturma seçeneğine izin veriyordu. Bununla ilgili ortak sorun, ikili ve başlıkları ayrı ayrı göndermemiz gerektiğiydi.

Daha sonra bazı geliştiriciler 'statik çerçeveler' yaratma fikriyle geldi. [.framework kitaplık ve başlıklara sembolik bağlantılar içeren bir klasördür]. Böyle bir örnek https://github.com/jverkoey/iOS-Framework

Bu seçenek iOS 7 veya 8 veya ondan önce çalışacaktır. Çünkü bunlar, başlık dosyalarını birlikte paketlemenin rahatlığı ile sadece statik kitaplıklardır.

Kaynaklarla ilgili sorularınıza gelince, onları ".bundle" olarak paketlememiz gerekir .. Onları göndermek için .framework klasörüne koyabileceğimizden emin değilim .. Geçmişte kitaplıklarımı şu şekilde gönderirdim: statik bir çerçeve ve paket ...

Ancak Swift kullanıyorsanız yukarıdaki seçenek sizin için çalışmayacaktır. Xcode, swift kodu içeren statik kitaplıklar oluşturmayı desteklemez.

Hızlı kullanım varsa Dinamik çerçevelerle gitmelisiniz. Teoride, Dinamik çerçeveler iOS7'de çalışır. Ancak, uygulamanın iOS7'yi hedeflemesi ve Dinamik çerçeveler kullanması durumunda iTunes Connect'in reddedeceğini düşünüyorum :-).

Bu yardımcı olur umarım


17

Xcode 9 ile birlikte Swift için de statik çerçeveler oluşturabilirsiniz. Bu, ABI kaynak uyumluluğu nedeniyle mümkündür. Tek yapmanız gereken Mach-O type, çerçeve hedefinin altında derlenen ayarlarını değiştirmektir . Bu teknik aynı zamanda Hibrit Çerçeveler (Swift ve Objective-C kodlu çerçeveler) için de geçerlidir.


Harika bir ipucu. Bana yardımcı olduğu için bu cevabın neden puan düşürüldüğünü bilmiyorum. \ Target'Build Settings \ Mach-O-Type ve Static Framework'ü seçin.
rustyMagnet

3
Abi uyumluluğu swift 4'te mevcut değil
csotiriou

8

staticveya dynamicadı genellikle Linking[Hakkında] türünü işaret eder

Çerçeveler olabilir staticveya dynamic[Statik veya dinamik kontrol edin]

A üzerinde etkisi olacak kitaplık biçimini [Hakkında] ' yı veya olarak Linkerdeğiştirerek değiştirebilirsiniz . Varsayılan olarak Xcode,Framework target -> Build Settings -> Mach-O TypeStatic LibraryDynamic LibraryDynamic Library değeri vardır.

Bu ayara bağlı olarak farklı türlerde ikili oluşturulacak

Bir tüketiciyi başarıyla yapılandırdıktan sonra [Link vs Embed]

Static Linker ld : derleme zamanında tüm kodu static libraryçalıştırılabilir nesne dosyasına dahil eder.

Dynamic Linker dyld : yükleme / çalıştırma zamanında @rpath[Hakkında] öğesini kullanarak gömülü çerçeveyi bulmaya ve bağlamayı deneyecek

[Kelime]


5

Tüm cevaplara sahip değilim ama bazı sorularınızı burada ele almaya çalışacağım.

  • İOS 7'de bu çerçeveleri kullanmak için bir uyarı alacaksınız, ancak hepsi bu, bir uyarı. Bu cevaba bakın .

  • CoreData gibi diğer kaynakları dahil edebilirsiniz, ancak bunları manuel olarak kodda oluşturmanız gerekir. İşte temel veri modelinin nasıl oluşturulacağını gösteren bir eğitim .

  • İOS için dinamik kitaplıkları kodlamanız gerekir.

  • Dağıtmayı planlıyorsanız, çerçevenizin hem simülatörü hem de cihaz mimarilerini desteklediğinden emin olmanız gerekir.


5

Swift, statik kitaplıkta çalışmaz. Dinamik çerçeve kullanmanız gerekiyorsa, minimum iOS'u 8.0 olarak ayarlamanız gerekir çünkü AppStore dinamik çerçeveyle ios 7'yi reddeder.


1
Statik bir kitaplığı hızlı tabanlı bir projeye
aktarabilirsiniz
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.