Perpustakaan? Statis? Dinamis? Atau Kerangka Kerja? Proyek di dalam proyek lain

151

Saya memiliki aplikasi iOS yang ada dan ingin menambahkan banyak kode yang saya kembangkan sebagai proyek lain hanya untuk kemudahan pengujian. Potongan baru pada dasarnya berkaitan dengan menyimpan gambar ke berbagai layanan berbagi, dll. Karena kode berbagi itu membutuhkan banyak pengujian dan pembaruan di masa mendatang, saya bertanya-tanya apa cara terbaik untuk memasukkan potongan kode itu ke dalam aplikasi saya yang ada.

Saya tidak tahu apakah itu harus perpustakaan statis, perpustakaan dinamis atau kerangka kerja, dan jujur, saya tidak begitu yakin apa perbedaannya, atau bagaimana saya harus melakukannya dan mengaturnya di Xcode.

Yang saya tahu adalah bahwa saya perlu / ingin menyimpan aplikasi pengujian dan pembaruan yang terpisah untuk kode berbagi dan membuat aplikasi utama menggunakannya.

pizzafilm
sumber
Anda dapat membuat kerangka kerja payung yang merupakan sesuatu seperti 'kerangka dalam kerangka' stackoverflow.com/a/27638841/1582217
Mohd Iftekhar Qurashi
kemungkinan duplikat dari Cara membuat kerangka Payung di iOS SDK?
Mohd Iftekhar Qurashi

Jawaban:

204

Pertama, beberapa definisi umum (khusus untuk iOS):

Pustaka statis - unit kode yang ditautkan pada waktu kompilasi, yang tidak berubah.

Namun, perpustakaan statis iOS tidak diperbolehkan mengandung gambar / aset (hanya kode). Anda dapat mengatasi tantangan ini dengan menggunakan bundel media .

Definisi yang lebih baik, lebih formal dapat ditemukan di Wikipedia di sini .

Pustaka dinamis - unit kode dan / atau aset yang ditautkan saat runtime yang dapat berubah.

Namun, hanya Apple yang diizinkan membuat pustaka dinamis untuk iOS. Anda tidak diizinkan membuat ini, karena ini akan membuat aplikasi Anda ditolak. (Lihat posting SO lainnya ini untuk konfirmasi dan alasan tentang hal itu).

Kerangka Perangkat Lunak - seperangkat kode yang dikompilasi yang menyelesaikan tugas ... karenanya, Anda sebenarnya dapat memiliki kerangka kerja statis atau kerangka kerja dinamis , yang biasanya hanya versi terkompilasi dari versi di atas.

Lihat Wiki pada Kerangka Kerja Perangkat Lunak untuk lebih jelasnya.

Oleh karena itu pada iOS, satu-satunya pilihan Anda pada dasarnya adalah menggunakan perpustakaan statis atau kerangka kerja statis (perbedaan utama adalah bahwa kerangka kerja statis .apaling sering didistribusikan sebagai file yang dikompilasi , sedangkan perpustakaan statis mungkin hanya dimasukkan sebagai subproyek - Anda dapat melihat semua kode - yang dikompilasi terlebih dahulu dan .afile yang dihasilkannya digunakan sebagai ketergantungan oleh proyek).

Sekarang kita sudah jelas (er) tentang persyaratan ini, menyiapkan perpustakaan statis dan bundel media pendukung untuk iOS tidak terlalu sulit, dan ada banyak tutorial tentang cara melakukannya. Saya pribadi akan merekomendasikan yang ini:

https://github.com/jverkoey/iOS-Framework

Ini adalah panduan yang cukup mudah dan tidak memiliki kelemahan berurusan dengan "perpustakaan statis palsu" ... lihat untuk info lebih lanjut ...

Setelah Anda membuat pustaka statis Anda, semudah memasukkannya sebagai submodule dalam Git untuk digunakan di berbagai proyek.

Semoga berhasil.

EDIT

Mengenai sub proyek dalam proyek, sejauh yang saya tahu, untuk mendapatkan ini bekerja / kompilasi dengan benar, Anda pada dasarnya harus menyiapkan rantai kompilasi tempat sub proyek dikompilasi terlebih dahulu, yang membuat .afile kerangka kerja statis yang digunakan sebagai dependensi oleh proyek.

Berikut tutorial lain yang bermanfaat yang membahas tentang ini:

http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/

EDIT 2

Pada iOS 8, Apple sekarang mengizinkan pengembang untuk membuat kerangka kerja yang dinamis! (Catatan: aplikasi Anda harus memiliki target minimum iOS 8 untuk memasukkan kerangka kerja dinamis ... porting kembali tidak diperbolehkan.)

Ini telah ditambahkan sebagai templat proyek baru. Dalam Xcode 6.1, ini dapat ditemukan di:

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework
JRG-Pengembang
sumber
Sejauh ini, tampaknya proyek tersebut adalah yang saya inginkan dan artikel itu sempurna. Saya telah memperhatikan satu efek samping yang aneh: Sub proyek yang saya seret ke dalam proyek utama saya juga memiliki kode pengujian saya (viewcontroller dan nib, appdelegate, dll), dan saya telah memastikan bahwa hanya kelas yang ingin saya gunakan di proyek utama diperiksa untuk digunakan di perpustakaan statis. Tetapi untuk beberapa alasan, ketika saya pergi untuk membuat lampiran ke file nib proyek utama saya, itu juga menunjukkan outlet dan tindakan dari subproyek saya. Ini pasti dapat menyebabkan beberapa kebingungan. Ada tips untuk menghilangkannya? Terima kasih!
pizzafilms
Dapatkah proyek dinamis diseret dan jatuh ke proyek statis, sehingga menjadikannya proyek statis? Saya benar-benar bingung, beberapa klarifikasi akan sangat hebat! Terima kasih sebelumnya :-)
Ravindranath Akila
1
@ JRG-Developer Kembali porting kerangka kerja dinamis diizinkan jika Anda mengikuti beberapa aturan: developer.apple.com/library/prerelease/ios/documentation/…
klefevre
Apakah mungkin untuk menetapkan target minimum yang lebih rendah dan menjadikan perpustakaan opsional?
kukudas
1. dapatkah Anda memasukkan beberapa contoh perpustakaan statis, perpustakaan dinamis, kerangka kerja yang terkenal? 2. Bisakah Anda memberikan contoh di mana Anda perlu melakukan itu? 3. Ingin tahu apa perbedaan antara pod dan perpustakaan statis?
Sayang
29

Format file Mach-O (Objek Mach - .o)

Di dunia iOS setiap file sumber dikonversi menjadi file objek - ABI [Tentang] File Mach-O [Tentang] yang akan dikemas ke dalam bundel yang dapat dieksekusi akhir (mis. Aplikasi, kerangka kerja ...), file (mis. Perpustakaan ...) dan perilakunya ditentukan oleh Mach-O type[Tentang]

Packageadalah direktori yang dengan sendirinya menjadi file - opaque file. Ini dibuat untuk pengalaman pengguna untuk mempersulit membuat beberapa perubahan ke dalam struktur internal yang dapat menyebabkan perilaku program yang tidak dapat diprediksi. Paket digunakan di Document Packageatau dengan a Bundle. Anda dapat menggunakan Show Package ContentsFinder

Bundleadalah direktori dengan struktur spesifik untuk mengatur biner (kode yang dapat dieksekusi) dan sumber daya untuk kode itu (misalnya gambar, nibs ...). Bundel berisi file Info.plist[Tentang] . Bundle dibuat untuk pengalaman pengembang . Juga bisa dikemas. Ada beberapa jenis bundel:

  • application bundle - Application target
  • framework bundledan versioned bundlesebagai subtipe -Framework Target
  • loadable bundle(aka plug-in bundle) - Bundle target(Bundel Pengujian UI, Bundel Pengujian Unit)
  • lainnya ( bundel dSYM[Tentang] )

Application- .ipa, .app[Tentang] - packaged application bundle- program yang dapat diluncurkan.

Tests- packaged loadable bundleyang digunakan untuk menguji biner. Arsitektur plug-in memungkinkan kita menambahkan fungsionalitas baru (test case) sebagai modul terpisah ke dalam biner yang ada

Perpustakaan dan Kerangka Kerja

Martin Fowler di InversionOfControl

Pustaka pada dasarnya adalah serangkaian fungsi yang dapat Anda panggil, hari ini biasanya diatur ke dalam kelas. Setiap panggilan berfungsi dan mengembalikan kontrol ke klien.

Kerangka kerja mewujudkan beberapa desain abstrak, dengan lebih banyak perilaku bawaan. Untuk menggunakannya Anda perlu memasukkan perilaku Anda ke berbagai tempat dalam kerangka kerja baik dengan subklasifikasi atau dengan menghubungkannya ke kelas Anda sendiri. Kode kerangka kerja kemudian memanggil kode Anda pada titik-titik ini. Kontrol utama program terbalik, dipindahkan dari Anda ke kerangka kerja. (Pembalikan Kontrol)

Perpustakaan dan Kerangka Kerja di iOS

Libraryadalah kumpulan file objek Mach-O [periksa statis atau dinamis] yang dikompilasi untuk satu atau lebih arsitektur.

Static library- .a(alias pustaka arsip statis, pustaka bersama statis tertaut [doc] ) - Ketika Anda menambahkannya ke dalam aplikasi Anda, penghubung statis selama waktu kompilasi akan menggabungkan file objek dari pustaka dan mengemasnya bersama dengan file objek aplikasi menjadi satu file yang dapat dieksekusi mengajukan. Kerugiannya adalah file keluaran besar

Dari Xcode 9.0, perpustakaan statis Swift didukung.

Dynamic library- .dylib(alias pustaka bersama dinamis, objek bersama, pustaka yang terhubung secara dinamis [doc] ) secara dinamis ditautkan dengan aplikasi yang dapat dieksekusi pada saat memuat atau runtime , tetapi tidak disalin ke dalamnya. Pada praktiknya paket aplikasi akan berisi folder Kerangka dengan .dylibfile. Semua perpustakaan sistem iOS dan macOS adalah dynamic. Kerugiannya adalah waktu peluncuran yang lambat karena semua perpustakaan dinamis harus disalin dan ditautkan.

[Static vs dynamic linking]

Text-based stub library- .tbd[Tentang] , ini adalah tulisan rintisan teks dynamic libraryyang terletak di perangkat target. Akibatnya, Anda tidak harus mengemas perpustakaan dinamis ke dalam bundel Anda. Ini memiliki efek ukuran.

Frameworkalias binary framework- .frameworkadalah not packaged framework bundle(agar pengembang dapat dengan mudah melihat header dan sumber daya) yang berisi static or dynamicpustaka yang dikompilasi , file header, dan sumber daya.

Static frameworkberisi static librarypaket dengan sumber dayanya.

Dynamic frameworkberisi dynamic librarydan sumber daya. Selain itu, kerangka kerja dinamis dapat menyertakan versi berbeda dari perpustakaan dinamis yang sama dalam satu bundel ( versioned bundle)

[Kerangka kerja statis vs dinamis]

Embedded frameworkadalah dynamic frameworkyang hidup di kotak pasir aplikasi. Jenis ini dibuat pertama-tama untuk ekstensi untuk membagikan kode dan sumber daya yang sama. Ini tersedia ketika target Penerapan adalah iOS 8+.

Umbrella framework [Target agregat] adalah kerangka kerja yang berisi kerangka kerja lain. Ini tidak didukung secara resmi di iOS dan itulah sebabnya tidak disarankan bagi pengembang untuk membuatnya [Dok resmi] . Pada kenyataannya itu adalah satu set sub-kerangka kerja (atau Nested Frameworks). Saat Anda membuat kerangka kerja yang memiliki ketergantungan, seorang konsumen (seperti aplikasi) bertanggung jawab untuk menambahkan ketergantungan ini bersama dengan kerangka kerja Anda ke dalam proyek. Sebagai pengembang, wajar untuk mencoba menemukan cara untuk mentransfer tugas ini dari konsumen ke Anda. Akibatnya Anda berpikir bahwa ituUmbrella frameworkadalah penyelamatan tetapi biasanya mengarah ke masalah serius dengan mengelola versi dan kompleksitas menciptakan dan mendukungnya.

Fake Framework- adalah hasil dari operasi tertentu di bawah a static libraryuntuk membuat bundel dengan .frameworkekstensi yang akan berperilaku sebagai dynamic framework. Teknik ini digunakan ketika Xcode tidak mendukung pembuatan framework karena tidak memiliki template framework. Salah satu realisasi kerangka palsu . Dengan Xcode 6, Apple telah menambahkan dukungan kerangka kerja iOS.

Modular Framework[Tentang] -@importini adalah kerangka kerja yang berisi.modulemapfile di dalamnya. Modul dapat berisi submodula. Keuntungan utama adalah Anda menghemat waktu membangunModular Framework.

Universal Library or Framework(alias Fat) [lipo] [Target agregat] mengandung banyak arsitektur. Misalnya build rilis Anda harus mendukung beberapa lengkungan yang dapat Anda atur melalui Build Active Architecture Only [ONLY_ACTIVE_ARCH]

Dependency[Tentang] Anda dapat menggunakan kode pihak ketiga sebagai bagian dari target Anda. Ini memungkinkan Anda untuk menggunakan kembali kode dari banyak sumber seperti - proyek lain, proyek di ruang kerja yang sama, target lain, perpustakaan, kerangka kerja dll.

Cara membangun dan menggunakan Perpustakaan Statis:

Cara membangun dan menggunakan Kerangka Kerja Dinamis [ubah ke statis]

[Sistem Pembuatan Xcode]
[Komponen Xcode]
[Dynamic linker]

yoAlex5
sumber
1
Dalam banyak tutorial Swift disebutkan bahwa Objective C tidak mendukung pustaka dinamis, di mana swift mendukung, [ altexsoft.com/blog/engineering/... ] Tetapi seperti yang saya tahu saya, OS8 dan seterusnya Objctive C mendukung pustaka dinamis. Bisakah Anda menjelaskan ini?
pratima
@pratima, Anda dapat membuat kerangka kerja dinamis pada Objective-C untuk iOS
yoAlex5
1
"Kerangka kerja statis berisi perpustakaan statis yang dikemas dengan sumber dayanya." Dari mana definisi ini berasal? AFAK, fase bangun "Copy Bundle Resources" kerangka kerja statis tidak berfungsi, seperti perpustakaan statis. Apa perbedaan antara framework statis dan perpustakaan statis?
toshi0383
@ toshi0383 Apakah Anda menemukan cara untuk menggabungkan perpustakaan statis (.a) dan sumber dayanya (.bundle) ke dalam satu kerangka kerja yang dapat kami distribusikan kepada konsumen?
user121095