Klarifikasi kerangka kerja Statis vs Dinamis iOS

115

Saya harus mengakui bahwa dengan dirilisnya iOS 8 saya agak bingung tentang kerangka kerja dinamis dan statis di iOS.

Saya mencari cara untuk mendistribusikan pustaka yang saya buat, dan saya perlu mendukung iOS 7 ke atas. (Catatan: Ini akan menjadi kerangka kerja berpemilik. Saya tidak dapat menggunakan buah kakao, dan saya juga tidak dapat mendistribusikan sumbernya). Inilah yang sudah saya ketahui:

  • iOS 8 memperkenalkan "kerangka kerja tertanam" untuk iOS, tetapi, seperti yang saya pahami, kerangka tersebut tidak berfungsi untuk iOS 7, hanya untuk iOS 8 dan yang lebih baru.
  • Saya memiliki opsi untuk mendistribusikan perpustakaan saya sebagai perpustakaan statis (file .a) dan juga mendistribusikan header. Saya tahu bahwa ini adalah cara umum untuk menghadapi situasi tersebut, tetapi saya ingin menemukan sesuatu yang lebih sederhana dari itu (dan juga menggabungkan beberapa sumber dengannya, jika memungkinkan).
  • Saya juga menemukan bahwa iOS 7 tidak mendukung pustaka .framework dinamis (hanya statis) karena tidak mendukung penautan dinamis. Tetapi iOS 8 melakukannya, serta tautan statis.

Dan inilah pertanyaan saya tentang informasi ini:

  • Saya melihat bahwa saya dapat membuat target .framework, dan membuatnya statis, dengan mengubah tipe Mach-O menjadi "pustaka statis. Apakah itu cukup untuk mendukung iOS 7 tanpa masalah, dan juga mendistribusikan pustaka saya sebagai .framework bundle? Jika demikian, mengapa "kerangka kerja yang disematkan" di iOS 8 menjadi masalah besar, seperti yang disarankan oleh banyak sumber daya di internet? Apakah saya melewatkan sesuatu?
  • Apakah perlu untuk membuat kode .framework seperti yang saya lakukan dengan aplikasi lain yang saya buat?
  • Bagaimana jika saya perlu menyertakan sumber daya lain (seperti Data Inti atau Gambar) dengan file .framework saya? Apakah saya perlu membuat file .bundle terpisah untuk itu?
csotiriou.dll
sumber
1
"iOS 7 tidak mendukung pustaka .framework karena tidak mendukung penautan dinamis" Pernyataan ini tidak benar.
Midhun MP
1
Saya melihat. bisakah kamu memberitahuku kalimat yang benar? Apakah itu salah karena iOS 7 mendukung penautan dinamis atau karena iOS 7 mendukung pustaka .framework? Atau keduanya?
csotiriou
1
Ingat AVFoundation dan CoreGraphics semuanya adalah .framework. Mungkin ini membantu Anda menemukan jawaban atas semua pertanyaan Anda: raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP
Saya memperbaiki kalimatnya. Saya sudah membaca tautannya, sebelum saya memposting pertanyaan saya. Link ini tidak menjelaskan apapun tentang pertanyaan saya. Ini dimulai dari pustaka statis dan membungkusnya menjadi file .framework SECARA MANUAL. Saya berbicara tentang target Cocoa Touch Framework di Xcode 6 dan kemudian mengubah jenisnya menjadi pustaka statis. Itu tidak menyebutkan penandatanganan kode (mengapa dan jika perlu), sumber daya tambahan, dll.
csotiriou
1
Anda dapat menggunakan CocoaPods untuk mendistribusikan kerangka berpemilik (misalnya Parse)
Ric Santos

Jawaban:

69

Sebelum iOS8, Xcode hanya mengizinkan opsi untuk membuat pustaka statis untuk iOS. Masalah umum yang terjadi adalah kami harus mengirimkan biner dan header secara terpisah.

Kemudian, beberapa pengembang datang dengan ide untuk membuat 'kerangka kerja statis'. [.framework hanyalah folder dengan tautan simbolis ke lib dan header]. Salah satu contohnya adalah https://github.com/jverkoey/iOS-Framework

Opsi ini akan berfungsi untuk iOS 7 atau 8 atau sebelumnya. Karena mereka hanyalah pustaka statis dengan kemudahan memaketkan file header.

Adapun pertanyaan Anda tentang sumber daya, kami perlu menggabungkannya dalam '.bundle' .. Untuk pengirimannya, saya tidak yakin apakah kami dapat menyertakannya di folder .framework .. Dulu saya biasa mengirimkan libs saya sebagai kerangka statis dan bundel ...

Namun opsi di atas tidak akan berfungsi untuk Anda jika Anda menggunakan Swift. Xcode tidak mendukung pembuatan pustaka statis yang menyertakan kode swift.

Anda harus menggunakan kerangka kerja Dinamis jika ada penggunaan yang cepat. Secara teori, kerangka kerja Dinamis berfungsi di iOS7 .. Tapi, saya pikir iTunes Connect akan menolak jika aplikasi menargetkan iOS7 dan menggunakan kerangka kerja Dinamis :-).

Semoga ini membantu

Subbu
sumber
17

Dengan Xcode 9 dan seterusnya, Anda juga dapat membuat kerangka statis untuk Swift. Ini dimungkinkan karena kompatibilitas sumber ABI. Yang perlu Anda lakukan hanyalah mengubah pengaturan yang Mach-O typesedang dibangun dari target kerangka kerja. Teknik ini juga berlaku untuk Hybrid Frameworks (kerangka kerja dengan kode Swift dan Objective-C).

Avijeet Dutta
sumber
Tip yang bagus. Tidak tahu mengapa jawaban ini diturunkan karena membantu saya. \ Target'Build Settings \ Mach-O-Type dan pilih Static Framework.
rustyMagnet
3
Kompatibilitas Abi tidak tersedia di swift 4
csotiriou
8

staticatau dynamicnama biasanya poin menjadi Linking[Tentang] jenis

Kerangka kerja bisa staticatau dynamic[Periksa statis atau dinamis]

Anda dapat mengubah format pustaka yang akan berdampak pada a Linkerdengan mengubah Framework target -> Build Settings -> Mach-O Type[About] menjadi Static Libraryatau Dynamic Library. Secara default Xcode memilikiDynamic Library nilai.

Bergantung pada pengaturan ini, berbagai jenis biner akan dihasilkan

Setelah Anda berhasil mengonfigurasi konsumen [Link vs Embed]

Static Linker ld : pada waktu kompilasi akan memasukkan semua kode dari static libraryke dalam file objek yang dapat dieksekusi.

Dynamic Linker dyld : pada waktu muat / jalankan akan mencoba menemukan kerangka tertanam menggunakan @rpath[About] dan menautkannya

[Kosa kata]

yoAlex5
sumber
6

Swift tidak berfungsi di lib statis. Jika Anda harus menggunakan kerangka dinamis, Anda harus mengatur min iOS ke 8.0 karena AppStore menolak ios 7 dengan kerangka dinamis

AliasCocoa
sumber
Anda dapat mengimpor pustaka statis ke dalam proyek berbasis cepat
C0D3
5

Saya tidak memiliki semua jawaban tetapi saya akan mencoba menjawab beberapa pertanyaan Anda di sini.

  • Anda akan mendapatkan peringatan untuk menggunakan kerangka kerja ini di iOS 7, namun hanya itu, peringatan. Lihat jawaban ini .

  • Anda dapat memasukkan sumber daya lain seperti CoreData namun Anda harus membuatnya dalam kode secara manual. Berikut tutorial yang menunjukkan cara membuat model data inti.

  • Anda harus membuat kode pustaka dinamis untuk iOS.

  • Anda perlu memastikan framework Anda mendukung simulator dan arsitektur perangkat jika Anda berencana untuk mendistribusikannya.

Beau Nouvelle
sumber